数独百变需要帮助

sudoku bactracking help needed

本文关键字:帮助 百变      更新时间:2023-10-16

我目前正在研究利用回溯来解决数独的数独求解器。我几乎完成了,但它崩溃了,我不知道为什么,我尝试在这里搜索与数独回溯相关的问题,但没有太多的线索,就我所能缩小问题的范围而言,我知道它在我的 solveBoard 功能中,但仍然不确定,我也尝试搜索不同的站点并得到了一些帮助,但还不够。有什么帮助吗?提前致谢

#include <iostream>
using namespace std;
bool findBlankLocation(int board[9][9], int&, int&);
bool inColumn(int [9][9], int, int);
bool inRow(int [9][9], int, int);
bool inBox(int [9][9], int, int, int);
bool blankLocation(int[9][9], int, int, int);
void printBoard(int [9][9]);
bool solveBoard(int [9][9]);
int main()
{
int board[9][9] =  {{3, 0, 6, 5, 0, 8, 4, 0, 0},
{5, 2, 0, 0, 0, 0, 0, 0, 0},
{0, 8, 7, 0, 0, 0, 0, 3, 1},
{0, 0, 3, 0, 1, 0, 0, 8, 0},
{9, 0, 0, 8, 6, 3, 0, 0, 5},
{0, 5, 0, 0, 9, 0, 6, 0, 0},
{1, 3, 0, 0, 0, 0, 2, 5, 0},
{0, 0, 0, 0, 0, 0, 0, 7, 4},
{0, 0, 5, 2, 0, 6, 3, 0, 0}};

if(solveBoard(board) == true)
printBoard(board);
else
cout << "nn>>>>No existe solucion...";

return 0;
}
bool findBlankLocation(int board[9][9], int &row, int &col)
{
for(int row=0; row<9;row++)
for(int col=0; col<9;col++)
if(board[row][col] == 0)
return true;
return false;
}
bool inColumn(int board[9][9], int col, int number)
{
for(int row=0; row<9; row++)
if(number == board[row][col])
return true;
return false;
}
bool inRow(int board [9][9], int row, int number)
{
for(int col=0; col<9; col++)
if(number == board[row][col])
return true;
return false;
}
bool inBox(int board[9][9], int startRow, int startColumn, int num)
{
for(int row = 0; row<3; row++)
for(int col = 0; col<3; col++)
if(board[row+startRow][col+startColumn] == num)
return true;
return false;
}
void printBoard(int board[9][9])
{
for (int i = 0; i < 9; i++)
{
for (int j = 0; j < 9; j++)
cout << "  " << board[i][j];
cout << endl;
}
}
bool blankLocation(int board[9][9], int row, int col, int num)
{
return !inColumn(board, col, num) && !inRow(board, row, num) 
&& !inBox( board,  row-row%3, col-col%3, num);
}
bool solveBoard(int board[9][9])
{
int row, col;
if (!findBlankLocation(board, row, col))
return true;
for (int num = 1; num <= 9; num++)
{
if (blankLocation(board, row, col, num))
{
board[row][col] = num;
if (solveBoard(board))
return true;
board[row][col] = 0;
}
}
return false;
}

in

bool findBlankLocation(int board[9][9], int &row, int &col)
{
for(int row=0; row<9;row++)
for(int col=0; col<9;col++)
if(board[row][col] == 0)
return true;
return false;
}

for(int row=0; row<9;row++)定义了一个名为row的新局部变量,该变量仅存在于for循环中,并隐藏了int &row参数。此循环本地row在循环退出时更新并丢失,参数row保持不变。然后,调用函数尝试使用它期望在findBlankLocation内部更新的未初始化变量,并触发未定义的行为。

海湾合作委员会对此发出警告:

..\src\main.cpp:34:6:警告:未使用的参数"行"[-Wunused-parameter] bool findBlankLocation(int board[9][9], int &row, int &col)

如果你把警告调到4级,Visual Studio也是如此。

1>d:\jobs\console应用程序1\控制台应用程序1\控制台应用程序1.cpp(36):警告 C4457:"行"声明隐藏函数参数 1>d:\jobs\consoleapplication1\consoleapplication1\consoleapplication1.cpp(34):注意:请参阅"row"声明 1>d:\jobs\consoleapplication1\consoleapplication1\consoleapplication1.cpp(34):警告 C4100:"row":未引用的形式参数

警告可以帮助您。打开它们并注意。

同样的错误会影响col

溶液

bool findBlankLocation(int board[9][9], int &row, int &col)
{
for (row = 0; row < 9; row++) // now uses row parameter
for (col = 0; col < 9; col++) // now uses col parameter
if (board[row][col] == 0)
return true;
return false;
}

这可能是由于以下块:

int row, col;
if (!findBlankLocation(board, row, col))
return true;

因此,rowcol的值是未定义的(与初始化为零不同)。请参阅此处,了解为什么它们的值未定义。

更新:

经过进一步调查,您似乎希望findBlankLocation(board,row,col)通过引用返回rowcol。然而,事实并非如此。

bool findBlankLocation(int board[9][9], int &row, int &col)
{
for(int row=0; row<9;row++)
for(int col=0; col<9;col++)
if(board[row][col] == 0)
return true;
return false;
}

上面的代码使用本地声明rowcol进行if(board[row][col] == 0)。因此,一旦找到行和列,它就会返回 true,而不会通过引用在rowcol参数中传递值。稍后,您在solveBoard函数中使用rowcol,假设它们填充了有效数据,而实际上它们不会。为了使findBlankLocation通过引用传递rowcol,它应如下所示:

bool findBlankLocation(int board[9][9], int &row, int &col)
{
for(row = 0; row < 9; ++row)
for(col = 0; col < 9; ++col)
if(board[row][col] == 0)
return true;
return false;
}

这样你就不会重新定义rowcolrowcol实际上将包含有效的数据。