数独求解器堆栈和逻辑解决方案不起作用

问题描述 投票:0回答:1

我正在尝试创建一个数独求解器来求解经典的 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 为空值。

java arrays nullpointerexception stack sudoku
1个回答
0
投票

您没有更新

while(isSolved() == false)
isSolve 的值,而应该是
bool isSolve = false
那么您可以说
while(!isSolved)
然后您必须在代码中的某个位置修改
isSolve = true
。您当前的实现不会更改您在此处发布的值,因此您最终将陷入无限循环。
    

© www.soinside.com 2019 - 2024. All rights reserved.