gpt4 book ai didi

c - 数独求解 - 在回溯中跳过舞台

转载 作者:太空宇宙 更新时间:2023-11-04 07:30:13 24 4
gpt4 key购买 nike

我已经在这里寻求帮助,但没有人回答,这真的很令人沮丧,我正在尝试编写一个代码来解决递归函数(回溯)中的数独问题,这是代码:

#include <stdio.h>
#include <windows.h>

#define SIZE 9
#define SQUARE_SIZE 3

void print(int arrBoard[SIZE][SIZE])
{
system("cls");
int i, j;
for (i = 0; i < SIZE; i++)
{
if (i % 3 == 0) printf("_ _ _ _ _ _ _ _ _ _ _ _\n");
for (j = 0; j < SIZE; j++)
{
if (j % 3 == 0) printf("| ");
printf("%d ", arrBoard[i][j]);
}
printf("\n");
}

Sleep(100);
}

BOOL IsValidRow(int arrBoard[SIZE][SIZE], int iNum, int iRow)
{
int iCol;

for (iCol = 0; iCol < SIZE; iCol++)
if (arrBoard[iRow][iCol] == iNum) return FALSE;

return TRUE;
}

BOOL IsValidCol(int arrBoard[SIZE][SIZE], int iNum, int iCol)
{
int iRow;

for (iRow = 0; iRow < SIZE; iRow++)
if (arrBoard[iRow][iCol] == iNum) return FALSE;

return TRUE;
}

BOOL IsValidSquare(int arrBoard[SIZE][SIZE], int iNum, int iRow, int iCol)
{
iRow-= (iRow % SQUARE_SIZE);
iCol-= (iCol % SQUARE_SIZE);

int i, j;
for(i = 0; i < SQUARE_SIZE; i++)
for (j = 0; j < SQUARE_SIZE; j++)
if (arrBoard[iRow + i][iCol + j] == iNum) return FALSE;

return TRUE;
}

BOOL IsValid(int arrBoard[SIZE][SIZE], int iNum, int iRow, int iCol)
{
if (IsValidRow(arrBoard, iNum, iRow) == FALSE) return FALSE;
if (IsValidCol(arrBoard, iNum, iCol) == FALSE) return FALSE;
if (IsValidSquare(arrBoard, iNum, iCol, iRow) == FALSE) return FALSE;

return TRUE;
}

BOOL _Solve(int arrBoard[SIZE][SIZE], int iRow, int iCol)
{
if (iRow == 9) return TRUE;

if (arrBoard[iRow][iCol])
{
iRow = (iCol == 8) ? iRow + 1 : iRow;
iCol = (iCol == 8) ? 0 : iCol + 1;

if(_Solve(arrBoard, iRow, iCol)) return TRUE;
return FALSE;
}

int iNewNum, iOldRow, iOldCol;
for (iNewNum = 1; iNewNum <= SIZE; iNewNum++)
{
if (IsValid(arrBoard, iNewNum, iRow, iCol))
{
arrBoard[iRow][iCol] = iNewNum;
print(arrBoard);
iOldRow = iRow; iOldCol = iCol;
iRow = (iCol == 8) ? iRow + 1 : iRow;
iCol = (iCol == 8) ? 0 : iCol + 1;

if (_Solve(arrBoard, iRow, iCol)) return TRUE;

iRow = iOldRow; iCol = iOldCol;
arrBoard[iRow][iCol] = 0;
}
}
return FALSE;
}

int main(void)
{
int arrBoard[SIZE][SIZE] =
{0, 1, 0, 3, 6, 4, 0, 2, 0,
6, 0, 0, 0, 0, 0, 0, 9, 7,
0, 0, 0, 9, 0, 7, 0, 0, 0,
0, 0, 6, 1, 0, 2, 8, 0, 0,
1, 9, 8, 0, 0, 0, 0, 3, 2,
0, 0, 7, 8, 0, 3, 9, 0, 0,
0, 0, 0, 7, 0, 8, 0, 0, 0,
4, 0, 0, 0, 0, 0, 0, 0, 3,
0, 2, 0, 4, 5, 6, 0, 1, 0};

_Solve(arrBoard, 0, 0);

fflush(stdin);
getchar();
return 0;
}

它不是真正的代码(只是因为 UI 现在不重要)。所以我在这里所做的是每次更改任何单元格时都打印电路板。我在尝试解决时看到一个错误,当它到达第 2 行的单元格时:2 列:6(在索引 [1][5] 中),它跳过数字 1(这是真正的答案),因为它没试过一个,它无法解决其余的数独问题。我不知道为什么它不起作用。

最佳答案

您已经完成了第一步,确定了问题发生的位置和时间。在调试器的帮助下,当 iRow 为 1 且 iCol 为 5 时,您可以单步执行 _Solve。这是我所看到的,只是看看当你的问题出现的第一点:

  • IsValid(arrBoard, iNewNum, iRow, iCol) 返回 FALSE

  • 进入该方法,IsValidSquare(arrBoard, iNum, iCol, iRow) 返回 FALSE

  • 再次查看该行,您在 iRow 之前设置了 iCol 似乎有点奇怪,而您在其他地方的模式是先行后列.比较声明/定义的调用,看起来您在调用点混淆了参数。

修复调用 IsValidSquare 的参数顺序并重新运行结果得到解决方案。

关于c - 数独求解 - 在回溯中跳过舞台,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14529425/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com