C# 数独重复数
代码工作,数独求解,但如果你写了几个相同的数字,程序会挂起,不会产生错误,它应该会。请帮忙C# 数独重复数,c#,sudoku,C#,Sudoku,代码工作,数独求解,但如果你写了几个相同的数字,程序会挂起,不会产生错误,它应该会。请帮忙 class Game { private int[,] puzzle = new int[9, 9]; public bool isAvailable(int row, int col, int num) { int rowStart = (row / 3) * 3; int colStart = (col / 3) * 3; f
class Game
{
private int[,] puzzle = new int[9, 9];
public bool isAvailable(int row, int col, int num)
{
int rowStart = (row / 3) * 3;
int colStart = (col / 3) * 3;
for (int i = 0; i < 9; ++i)
{
if (puzzle[row, i] == num) return false;
if (puzzle[i, col] == num) return false;
if (puzzle[rowStart + (i % 3), colStart + (i / 3)] == num) return false;
}
return true;
}
public bool fillSudoku(int row, int col)
{
if (row < 9 && col < 9)
{
if (puzzle[row, col] != 0)
{
if ((col + 1) < 9) return fillSudoku(row, col + 1);
else if ((row + 1) < 9) return fillSudoku(row + 1, 0);
else return true;
}
else
{
for (int i = 0; i < 9; ++i)
{
if (isAvailable(row, col, i + 1))
{
puzzle[row,col] = i + 1;
if (fillSudoku(row, col)) return true;
else puzzle[row,col] = 0;
}
}
}
return false;
}
else return true;
}
public void checkSolutions()
{
if (!fillSudoku(0, 0))
{
Console.Write("\n\nNow Solutions\n\n");
}
}
}
fullcode:因此,您陷入一个紧密循环的原因在于以下几行代码
if (fillSudoku(row, col)) return true;
else puzzle[row,col] = 0;
这里,您假设您得到的输入总是有效的
在数独开始时调用isValid函数可能是个好主意,这样可以更快地消除重复项
-下面是后来添加的。
调用作为你的数独游戏的第一行是有效的
请根据需要进行优化
public int isThisValid(int[] oneGroup) {
// return 0 for invalid
// return 1 for valid but incomplete
// return 2 for valid and complete.
boolean isFilled[] = new boolean[9];
for(int i = 0; i < 9; i++) {
int num = oneGroup[i];
if(isFilled[num] == true) {
// duplicate - bailout.
return 0;
}
// else fill the spot
isFilled[num] = true;
}
for(int i = 0; i < 9; i++) {
if(isFilled[i] == false) {
return 1;
}
}
return 2;
}
// check for validity
// empty is allowed.
public boolean isValid()
{
for( int row = 0; row < 9; row++) {
if(!isRowValid(row)) return false;
}
for( int col = 0; col < 0; col++) {
if(!isColValid(col)) return false;
}
for( int boxNo = 0; boxNo < 9; boxNo++) {
if(!isBoxValid(boxNo)) return false;
}
return true;
}
public boolean isRowValid(int rowNum) {
int[] row = new int[9];
for( int i = 0 ; i < 9; i++ ) {
row[i] = puzzle[rowNum][i];
}
int isValid = isThisValid(row);
return (isValid == 0);
}
public boolean isColValid(int colNum) {
int[] cols = new int[9];
for( int i = 0 ; i < 9; i++ ) {
cols[i] = puzzle[i][colNum];
}
int isValid = isThisValid(cols);
return (isValid == 0);
}
public boolean isBoxValid(int boxNum) {
// please do needful here :)
return true;
}
添加前添加检查,没有错误
public bool isAvailable(int row, int col, int num)
{
int rowStart = (row / 3) * 3;
int colStart = (col / 3) * 3;
for (int i = 0; i < 9; ++i)
{
if (puzzle[row, i] == num) return false;
if (puzzle[i, col] == num) return false;
if (puzzle[rowStart + (i % 3), colStart + (i / 3)] == num) return false;
}
return true;
}
你试过调试它吗?试过了,我还是不明白为什么和这里的地址。如果你在你的fillSudoku方法中使用fillsukurow,col,你可能会进入一个无限循环。但是如果一切都很好,并且数字的排列是正确的,那么就没有循环了。你正在执行递归调用。你正在调用fillSudoku中的fillSudoku,而fillSudoku又称为fillSudoku,等等。。作为fillSudoku中的第一条语句,添加Debug.WriteLinefillSudoku,并使用+row.ToString++col.ToString调用;看看发生了什么,我一点也不明白。插入的具体内容和位置?对不起,应该在isBoxValid块中?isBoxValid是您需要在与isRowValid和isColValid类似的行中写入的内容
public bool isAvailable(int row, int col, int num)
{
int rowStart = (row / 3) * 3;
int colStart = (col / 3) * 3;
for (int i = 0; i < 9; ++i)
{
if (puzzle[row, i] == num) return false;
if (puzzle[i, col] == num) return false;
if (puzzle[rowStart + (i % 3), colStart + (i / 3)] == num) return false;
}
return true;
}
if (isAvailable(x - 1, y - 1, num))
{
puzzle[x - 1, y - 1] = num;
}
else
{
Console.WriteLine("ERROR");
}