c#用int数组解决八个皇后?

时间:2017-07-16 23:31:51

标签: c# arrays int

要对8皇后问题中的1600万个组合进行排序,我使用一个8位数字,其中每个数字代表一列,数字的值是行。没有数字可能重复。我的函数接受一个数字,将其转换为字符串,然后转换为char数组,然后转换为int数组。是否有更简单的方法来获得一个int数组?

此外,此代码中还有任何可用的优化:

        private bool IsValidSolution(int MyInt)
    {
        string sNum = MyInt.ToString();
        int iVal = 0;
        int i, k, j;
       // Eliminate row and column conflicts.
        char[] aChars = sNum.ToCharArray();
        int[] aInt = Array.ConvertAll(aChars, c => (int)Char.GetNumericValue(c));
        // The first false in the array is just a placeholder. Of interest are positions 1 - 8).
        bool[] aCheck = new bool[] { false, false, false, false, false, false, false, false, false, false };
        for (i = 0; i < 8; i++)
        {
            iVal = aInt[i];
            if (iVal == 0 || iVal == 9) return false;
            if (aCheck[iVal] == false)
            {
                aCheck[iVal] = true;
            } else {
                return false;
            }
        }
        // Eliminate diagonal conflicts.
        for (k = 0; k < 7; k++)
        {
            j = k + 1;
            for (i = j; i < 8; i++)
            {
                if (Math.Abs(aInt[k] - aInt[i]) == Math.Abs(k - i)) return false;
            }
        }

        return true;
    }

1 个答案:

答案 0 :(得分:0)

是的,你可以,使用数字算术,假设n = 4,732

要获得千位数,你可以做(​​int)n / 1000。

要获得数百位数:((int)n / 100)%10

你做的十位数(3):((int)n / 10)%10

依此类推......并将每个值放在int数组的块中

可以循环完成