难以理解此应用程序中的递归
Trouble understanding recursion in this application
我正在为数独谜题编写递归求解器。我用 0 存储空白处,以便我的程序可以更轻松地读取它们。我从下标 1 开始存储原始拼图,以便更好地可视化网格。我不确定我是否完全掌握了递归,这就是问题所在。我得到的输出似乎正在解决难题,但它在那里留下了不应该存在的零。我认为这与我的unsetSquare的位置或返回语句有关。
下面是输出的示例...
**************************************************
7 4 3 | 8 2 1 | 5 6 8
2 6 8 | 0 9 0 | 0 1 0
0 0 0 | 0 0 6 | 0 0 4
---------|---------|---------
0 0 0 | 0 0 0 | 2 3 9
0 0 0 | 0 0 0 | 0 0 0
4 1 5 | 0 0 0 | 0 0 0
---------|---------|---------
9 0 0 | 5 0 0 | 0 0 0
0 2 0 | 0 1 0 | 7 4 0
0 0 0 | 2 0 0 | 9 0 5
**************************************************
**************************************************
7 4 3 | 8 2 1 | 5 6 9
2 6 8 | 0 9 0 | 0 1 0
0 0 0 | 0 0 6 | 0 0 4
---------|---------|---------
0 0 0 | 0 0 0 | 2 3 9
0 0 0 | 0 0 0 | 0 0 0
4 1 5 | 0 0 0 | 0 0 0
---------|---------|---------
9 0 0 | 5 0 0 | 0 0 0
0 2 0 | 0 1 0 | 7 4 0
0 0 0 | 2 0 0 | 9 0 5
**************************************************
**************************************************
7 4 3 | 8 2 1 | 5 6 0
2 6 8 | 1 9 0 | 0 1 0
0 0 0 | 0 0 6 | 0 0 4
---------|---------|---------
0 0 0 | 0 0 0 | 2 3 9
0 0 0 | 0 0 0 | 0 0 0
4 1 5 | 0 0 0 | 0 0 0
---------|---------|---------
9 0 0 | 5 0 0 | 0 0 0
0 2 0 | 0 1 0 | 7 4 0
0 0 0 | 2 0 0 | 9 0 5
**************************************************
**************************************************
7 4 3 | 8 2 1 | 5 6 0
2 6 8 | 2 9 0 | 0 1 0
0 0 0 | 0 0 6 | 0 0 4
---------|---------|---------
0 0 0 | 0 0 0 | 2 3 9
0 0 0 | 0 0 0 | 0 0 0
4 1 5 | 0 0 0 | 0 0 0
---------|---------|---------
9 0 0 | 5 0 0 | 0 0 0
0 2 0 | 0 1 0 | 7 4 0
0 0 0 | 2 0 0 | 9 0 5
**************************************************
**************************************************
7 4 3 | 8 2 1 | 5 6 0
2 6 8 | 3 9 0 | 0 1 0
0 0 0 | 0 0 6 | 0 0 4
---------|---------|---------
0 0 0 | 0 0 0 | 2 3 9
0 0 0 | 0 0 0 | 0 0 0
4 1 5 | 0 0 0 | 0 0 0
---------|---------|---------
9 0 0 | 5 0 0 | 0 0 0
0 2 0 | 0 1 0 | 7 4 0
0 0 0 | 2 0 0 | 9 0 5
**************************************************
请注意,在第一行的末尾,它转到 8 寻找解决方案,然后转到 9,9 是不合法的,并且它已经到达了 for 循环的末尾,因此它将其替换为零并继续。如何让它返回尝试第一行中的不同数字以获得更完整的解决方案?
这是我的递归函数...
bool DoTheWork::addSquare(int& depth, ostream& outStream){
for(int i = ONE; i <= NINE; ++i){
for(int j = ONE; j <= NINE; ++j){
if(i == NINE && j == NINE && board.getSquare(NINE, NINE) != ZERO){
cout << i << " " << j << endl;
return true;
}
//cout << "original" << board.getSquare(i, j) << "coord: " << i << ", " << j << endl;
if(board.getSquare(i, j) == ZERO){
//cout << "original: " << board.getSquare(i, j) << "coord: " << i << ", " << j << endl;
for(int k = ONE; k <= NINE; ++k){
board.setSquare(i, j, k);
board.display(outStream);
if(board.isLegal()){
return addSquare(depth, outStream);
}
else{
board.unsetSquare(i, j);
}
}
}
}
}
board.display(outStream);
return false;
}
我可以看到一个问题:
它应该是:
if(board.isLegal()){
if( addSquare(depth, outStream))
return true;
}
意味着如果整个板被解决,则回滚。
编辑 想一想:
你在第一个方格中输入 1,它返回 false。 你不想尝试放 2 吗?
编辑2更多问题:
if(i == NINE && j == NINE && board.getSquare(NINE, NINE) != ZERO){
cout << i << " " << j << endl;
return true;
}
这应该是完成检查吗? 你只检查 1 个正方形。 在您的样品中,它已填充!您需要检查是否没有 0。
编辑3:
bool DoTheWork::addSquare(int& depth, ostream& outStream){
//use flag to let you know if all completed
bool zeroFound = false;
for(int i = ONE; i <= NINE; ++i){
for(int j = ONE; j <= NINE; ++j){
//cout << "original" << board.getSquare(i, j) << "coord: " << i << ", " << j << endl;
if(board.getSquare(i, j) == ZERO){
zeroFound = true;
//cout << "original: " << board.getSquare(i, j) << "coord: " << i << ", " << j << endl;
for(int k = ONE; k <= NINE; ++k){
board.setSquare(i, j, k);
board.display(outStream);
if(board.isLegal()){
if(addSquare(depth, outStream)){
return true;
}
else{
board.unsetSquare(i, j);
}
}
}
}
}
}
board.display(outStream);
return !zeroFound; //true in case it is full!
}
事实证明,我有一些东西的顺序错误,而且不在正确的范围内。在成功完成 while 循环后,我找到了带有 for 循环的解决方案。
bool DoTheWork::addSquare(int& depth, ostream& outStream){
for(int i = 1; i < 10; ++i){
for(int j = 1; j < 10; ++j){
if(board.getSquare(i, j) == 0){
if(i == 10){
return true;
}
for(int k = 1; k <= 9; ++k){
board.setSquare(i, j, k);
if(board.isLegal() && addSquare(depth, outStream)){
return true;
}
}
board.unsetSquare(i, j);
return false;
}
}
}
}
相关文章:
- 如何将记忆应用于此递归函数?
- 是否总是可以将使用递归编写的程序重写为不使用递归的程序C++,性能观点是什么?
- 递归应用 C++20 范围适配器会导致编译时无限循环
- 递归程序的执行流程
- 递归程序获得勒让德多项式
- 当有 2 个或更多递归函数写入 togeather 时,程序如何执行?
- 递归导致程序崩溃,但 while 循环中的相同概念不是来自C++析构函数
- 这个简单的程序如何不表示递归?
- 执行递归函数时 C++ 应用程序崩溃
- 如何理解哪个递归函数程序需要
- 以下递归程序的最后一行是如何工作的
- 如何使用mongocxx c ++驱动程序递归生成Mongodb文档?
- C 程序.该程序应使用递归和循环
- 具有递归函数且不带全局变量的程序 - C++
- 输出中的特定递归反向程序问题
- 在 std::函数上递归应用 std::bind 的问题
- 难以理解此应用程序中的递归
- 运算符>的递归应用
- 我的递归fibonacci程序出了什么问题
- 递归n皇后程序中c++分段错误的处理