我的数独求解器函数有什么问题?
What's wrong with my sudoku solver function?
ok,所以我将函数更改为回溯函数(我在网上找到的)。它仍然从文件中读取并将其输入到数组中,检查函数工作正常,所以我没有改变它。如果你想知道以下是我试图解决的难题(其中零是空白的空间)。
0 5 0 0 2 0 0 7 0
7 2 0 4 0 3 0 0 0
9 0 0 0 5 0 6 2 0
0 0 5 0 8 6 0 0 0
1 0 0 0 4 0 0 0 8
0 0 0 2 3 0 4 0 0
0 9 3 0 1 0 0 0 2
0 0 0 3 0 2 0 4 6
0 8 0 0 0 0 0 1 0
// backtracking function
void Sudoku::solvePuzzle()
{
int x = 0;
int y = 0;
int r = 0;
bool back_flag;
while (r < 81) {
back_flag = true;
x = r/9;
y = r%9;
for(int num = arr[x][y]; num < 10 && back_flag; num++) {
if(check(x,y,num)) {
arr[x][y] = num;
back_flag=false;
break;
}
else if(num >= 9) {
arr[x][y] = 0;
}
}
if(back_flag) {
r--;
}
else {
r++;
}
}
}
我不知道这是否是唯一的错误,但乍一看,我认为,而不是
if (count == 1 && arr[r][c] == 0) {
tempNum = num;
}
else {
tempNum = 0;
}
count++;
应该是
count++;
if (count == 1) {
tempNum = num;
}
而不是
if (count == 1 && check(r, c, num) && arr[r][c] == 0) {
arr[r][c] = tempNum;
应该是
if (count == 1 && check(r, c, tempNum)) {
arr[r][c] = tempNum;
或仅
if (count == 1 ) {
arr[r][c] = tempNum;
因为当count==1
时,check(r, c, tempNum)
不可能为假,只要check
函数没有副作用。
for (int r = 0; r < MAX_ROW; r++) {
for (int c = 0; c < MAX_COL; c++) {
if(arr[r][c] != 0)
continue;
// ** no tests for arr[r][c] == 0 in this code block any more
// ...
}
}
最后一件事:如果外循环中的零的数量从一次迭代到下一次迭代不再改变,你应该停止算法,将会有你的解算器无法解决的数独,我猜你不想让你的程序进入一个无尽的循环。
相关文章:
- 警告处理为错误这里有什么问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 当我尝试添加 2 个大字符串时,我无法弄清楚出了什么问题
- 违反const正确性:我应该现实地期待什么问题
- 这个带有模板<类 Vector 的C++代码片段有什么问题>
- 我的逻辑反转字符串中的元音有什么问题?
- 需要以下代码的帮助,下面的代码有什么问题
- 常量公共成员有什么问题?
- 以下代码中的函数模板有什么问题?
- 这个返回元素位置的基于循环的函数有什么问题?
- creat_list2功能有什么问题?
- 格式说明符C++有什么问题
- 任何人都可以告诉我我的 C++ 代码出了什么问题?
- 从 argv[1] 转换为字符 * 字符串后有什么问题?
- 我的堆栈和库存清单程序的结构有什么问题?
- 此工厂功能有什么问题?
- 以下 C++ 代码有什么问题?
- 数组为此合并排序函数提供了正确的输出,但向量给出了不正确的输出.出了什么问题?
- reinterpret_cast,只读访问,简单的可复制类型,会出什么问题?
- 它解决了什么问题,对于非真空初始化,生命周期在初始化之前就开始了