我正在尝试创建一个数独求解器来求解经典的 9x9 数独板。为了实现这一目标,我使用了多种不同的逻辑方法,例如当只有一个可能的答案时求解单元格/正方形,但是我无法涵盖每一种情况。目前,当我的代码陷入死胡同并无限循环时,我尝试实现可以猜测数字的代码,并检查棋盘是否可以通过该猜测来解决。如果这不起作用,程序应恢复到之前的板状态。我已经被困在这个问题上很多个小时了,没有任何进展 这是我的代码的 GitHub 链接,“https://github.com/Yeldood/SOCS/tree/main/SudokuSolve/Sudoku%20Solver/src/sudokuCode
这是我认为有问题的代码,
public void logicCycles()throws Exception
{
Stack <Cell[][]> stack = new Stack<Cell[][]>();
Board[] manta = new Board[81];
int pointer = 0;
boolean check = false;
int previousSolve = -3;
System.out.println("2");
while(isSolved() == false)
{
int changesMade = 0;
do
{
changesMade = 0;
changesMade += logic1();
//changesMade += logic2();
// changesMade += logic3();
// changesMade += logic4();
// System.out.println("P:");
// displayPotentials();
display();
// displayPotentials();
Thread.sleep(10);///TODO: get rid of
if(errorFound()) {//reverts board to previous version, and eliminate previous guess
pointer--;
board = manta[pointer].board;//reverts board to previous version
for(int y = 0; y < 9; y++)
for(int x = 0; x < 9; x++)
if(board[y][x].getNumber() == 0 && board[y][x].numberOfPotentials() > 1)
board[y][x].cantBe(previousSolve);
else if(board[y][x].getNumber() == 0 && board[y][x].numberOfPotentials() == 1) {
solve(x,y, board[y][x].getFirstPotential());
}
changesMade++;
// stack.pop();
// for(int y = 0; y < 9; y++)//eliminate prev guess
// for(int x = 0; x < 9; x++)
// if(board[y][x].getNumber() == 0 && board[y][x].numberOfPotentials() > 1) {
// board[y][x].cantBe(board[y][x].getFirstPotential());
// }
}
System.out.println("Changes made: " + changesMade);
}while(changesMade != 0);
check = false;
for(int y = 0; y < 9; y++){//Copy board then guess the first potential of the first cell with current board
for(int x = 0; x < 9; x++){
if(board[y][x].getNumber() == 0 && board[y][x].numberOfPotentials() > 1) {
// stack.push(board);
manta[pointer] = new Board();
manta[pointer].board = boardCopy().board;
// board = boardCopy().board;
previousSolve = board[y][x].getFirstPotential();
solve(x,y,previousSolve);//Solves for a guess
System.out.println("Board guess made");
System.out.println("New board");
display();
check = true;
pointer++;
break;
}
}
if(check)
break;
}
}
}
public Board boardCopy() {
boolean[] currentPotential = new boolean[10];
Board temp = new Board();
for(int h = 0; h < 9; h++)
for(int l = 0; l < 9; l++) {
currentPotential = new boolean[10];
for(int u = 1; u < 10; u++) {
currentPotential[u] = board[h][l].canBe(u);
}
Cell tempCell = new Cell();
temp.board[h][l] = tempCell;
temp.board[h][l].setBoxID(board[h][l].getBoxID());
temp.board[h][l].setNumber(board[h][l].getNumber());
temp.board[h][l].setPotential(currentPotential);
}
return temp;
}
我尝试在没有猜测的情况下对其进行测试,并且它工作得很好,没有任何异常,因此这使我得出结论,猜测是问题所在。我用于棋盘数组的指针最终变为负数,这导致我的棋盘数组 manta 为空值。
您没有更新
while(isSolved() == false)
isSolve 的值,而应该是 bool isSolve = false
那么您可以说 while(!isSolved)
然后您必须在代码中的某个位置修改 isSolve = true
。您当前的实现不会更改您在此处发布的值,因此您最终将陷入无限循环。