数独的判断方法
给出一个二维数组,代表数独,判断是否有错。
刚开始是针对完整的数独写判断方法,但是后面一想如果要做数独的交互程序的话,用户可能需要在填了一半数独时去检验自己是否出了问题。所以针对半完成的数独做了调整,其实就是对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;/*未发现错误*/ }