数独百变需要帮助
sudoku bactracking help needed
我目前正在研究利用回溯来解决数独的数独求解器。我几乎完成了,但它崩溃了,我不知道为什么,我尝试在这里搜索与数独回溯相关的问题,但没有太多的线索,就我所能缩小问题的范围而言,我知道它在我的 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;
因此,row
和col
的值是未定义的(与初始化为零不同)。请参阅此处,了解为什么它们的值未定义。
更新:
经过进一步调查,您似乎希望findBlankLocation(board,row,col)
通过引用返回row
和col
。然而,事实并非如此。
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;
}
上面的代码使用本地声明row
和col
进行if(board[row][col] == 0)
。因此,一旦找到行和列,它就会返回 true,而不会通过引用在row
和col
参数中传递值。稍后,您在solveBoard
函数中使用row
和col
,假设它们填充了有效数据,而实际上它们不会。为了使findBlankLocation
通过引用传递row
和col
,它应如下所示:
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;
}
这样你就不会重新定义row
和col
,row
和col
实际上将包含有效的数据。
- std::具有相同基类的类的变体
- 访问者访问变体并返回不同类型时出错
- 需要帮助设置在C++中使用的Potrace
- 在指针的帮助下,文本文件中单词的频率
- 我应该使用什么来代替void作为变体中的替代类型之一
- 将shared_ptr移动到<StructA>shared_ptr<变体<结构A、结构 B>>
- 如何比较自定义类的std::变体
- 通过网络、跨平台传递std::变体是否安全
- 计算每个节点的树高,帮助我解释这个代码解决方案
- 如何在Qbutton的帮助下更改Q对话框的宽度
- 需要帮助将结构数组传递给函数
- 有可能使shared_ptr协变吗
- 对于循环变体比较
- 在不传递参数数量且只有3个点的情况下,如何使用变差函数
- 当无法使用模板和宏时,生成类型变体C++代码的最简单方法是什么?
- C++需要帮助从用户那里获得一个整数,并确保它在另外两个整数之间
- 为什么导入Mixed native/CLR lib.dll的本机C++应用程序没有在Mixed lib.dll中的外部变
- 数独百变需要帮助
- 正弦曲线方程需要帮助,其中波峰在每次迭代中都会增加,但波谷保持不变
- 需要帮助的变量转换和添加一个“”到现有的变量值