博客完善--数独判断方法的介绍

  数独的判断方法

  给出一个二维数组,代表数独,判断是否有错。

  刚开始是针对完整的数独写判断方法,但是后面一想如果要做数独的交互程序的话,用户可能需要在填了一半数独时去检验自己是否出了问题。所以针对半完成的数独做了调整,其实就是对0做一个特殊判断就行。

  talk is cheap,show me the code!

  这段代码我写了注释,就不多解释了。

  这段代码有问题,给出了更正后的代码,当然了,也不能保证完全没有问题。

public int Check()/*检查该矩阵是否满足数独规则,0-满足规则*/
        {                   /*1--9-该0行出错;10--18-该数字-9列出错;19--27- -18个宫格出错*/
            for (int i = 0; i < 9; i++)/*检查行的重复*/
            {
                bool[] line = new bool[10];
                for (int j = 0; j < 9; j++)
                {
                    if (line[numbers[i, j]] && numbers[i, j] != 0) return i;/*出错行为第i行*/
                    else line[numbers[i, j]] = true;
                }
            }
            for (int i = 0; i < 9; i++)/*检查列的重复*/
            {
                bool[] row = new bool[10];
                for (int j = 0; j < 9; j++)
                {
                    if (row[numbers[j, i]] && numbers[j, i] != 0) return i + 9;/*出错在第i列*/
                    else row[numbers[j, i]] = true;
                }
            }
            int p = 3, q = 3;
            while (p <= 9 && q <= 9)
            {
                bool[] pane = new bool[10];
                for (int i = 0; i < p; i++)
                {
                    for (int j = 0; j < q; j++)
                    {
                        if (pane[numbers[i, j]] && numbers[i, j] != 0) return i + 18;/*出错行为第i个宫格*/
                        else pane[numbers[i, j]] = true;
                    }
                }
                p += 3;
                q += 3;
            }

return 0;/*未发现错误*/ }

  不过这段代码还没有经过正式的测试,VS的测试方法我还不知道使用,一直懒怠去学,先这样吧!

注:红色的为更正的地方!

public static int Check(int[,] numbers)/*检查该矩阵是否满足数独规则,0-满足规则*/
        {                   /*1--9-该0行出错;10--18-该数字-9列出错;19--27-该数字-18个宫格出错*/
            for (int i = 0; i < 9; i++)/*检查行的重复*/
            {
                bool[] line = new bool[10];
                for (int j = 0; j < 9; j++)
                {
                    if (line[numbers[i, j]] && numbers[i, j] != 0) return i+1;/*出错行为第i行*/
                    else line[numbers[i, j]] = true;
                }
            }
            for (int i = 0; i < 9; i++)/*检查列的重复*/
            {
                bool[] row = new bool[10];
                for (int j = 0; j < 9; j++)
                {
                    if (row[numbers[j, i]] && numbers[j, i] != 0) return i + 10;/*出错在第i列*/
                    else row[numbers[j, i]] = true;
                }
            }
            int p = 3, q = 3;
            while (p <= 9 && q <= 9)
            {
                bool[] pane = new bool[10];
                for (int i = p-3; i < p; i++)
                {
                    for (int j = q-3; j < q; j++)
                    {
                        if (pane[numbers[i, j]] && numbers[i, j] != 0) return p/3*3+q/3+19;/*出错行为第i个宫格*/
                        else pane[numbers[i, j]] = true;
                    }
                }
                q += 3;
                if (q == 9) 
                {
                    p += 3;
                    q = 3;
                }
            }

            return 0;/*未发现错误*/
        }

 

posted on 2018-04-09 16:46  好好学习呀)  阅读(523)  评论(0编辑  收藏  举报