好吧所以我将我的功能改为回溯功能(我在网上找到)。它仍然从文件读取并将其输入数组,检查功能正常工作,所以我没有改变它。如果您想知道以下是我正在尝试解决的难题(其中零是空格)。
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++;
}
}
}
答案 0 :(得分:1)
我不知道这些是否是唯一的错误,但乍一看,我认为不是
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
// ...
}
}
最后一件事:如果外循环中的零个数从一次迭代到下一次迭代不再变化,你应该停止算法,你的解算器将无法解决SuDoKus,你不想让我为你编程进入无限循环,我想。