方法在 Java 中没有 return 辅助变量

method doesn't return auxiliary variable in Java

我正在尝试编写一种方法来检查数独谜题是否有唯一解,如果为真,则 return 带有空格的谜题可以解决它。

这是生成它的 class:

public class Sudoku {

    private SudokuGen sudoku;
    private boolean isUnique;

    public Sudoku(){
        this.isUnique = false;
        while (!this.isUnique){
            this.setSudoku(createUniqueSolution());
        }
        this.sudoku.getMyboard().showSudokuMatrix();
    }

    private SudokuGen createUniqueSolution(){
        SudokuGen auxSudoku = new SudokuGen();
        this.setSudoku(auxSudoku);
        this.sudoku.getMyboard().showSudokuMatrix();
        Position availableMove = auxSudoku.getFirstAvailableMove();
        while (availableMove != null){
            int row,col;
            row = availableMove.getX();
            col = availableMove.getY();
            Integer value = auxSudoku.getValidvalue(row, col, 0);
            auxSudoku.makeMove(row, col, value);
            auxSudoku.loadValidvalues();
            availableMove = auxSudoku.getFirstAvailableMove();
        }
        if (auxSudoku.getSolved()){

            System.out.println("Unique solution");
            this.isUnique = true;
            return this.getSudoku();
        }
        else{
            System.out.println("Solution is not unique");
            return null;
        }
    }

    public void setSudoku(SudokuGen sudoku){
        this.sudoku = sudoku;
    }

    public SudokuGen getSudoku(){
        return (this.sudoku);
    }

}

SudokuGen return 是一个生成的谜题,我不知道解法是否唯一。所以我调用 createUniqueSolution 来检查它。

首先它创建 auxSudoku 并保存它,然后它开始使用 auxSudoku 拼图检查解决方案是否唯一。

然后我让下一个候选人再次调用 availableMove,直到它为 null。

所以简而言之,我的问题是如果我使用辅助变量,为什么会修改this.sudoku。提前谢谢你。

这是代码的输出:

    212 238 0 0 175 372 311 0 103 
    0 0 0 238 0 103 312 372 0 
    0 372 0 0 212 0 238 175 0 
    0 312 0 0 372 311 212 10 0 
    372 0 10 0 238 0 103 312 0 
    0 212 0 0 0 0 372 311 0 
    311 0 0 372 10 175 0 0 312 
    312 0 238 311 0 212 175 0 0 
    24 0 372 312 0 0 10 0 0 
    Solution is not unique

    0 100 49 71 185 0 0 262 178 
    0 71 262 0 300 49 0 100 257 
    0 0 177 100 262 0 71 0 0 
    0 185 300 262 71 100 178 0 0 
    0 0 0 177 49 0 0 0 0 
    0 0 178 300 257 185 0 71 0 
    0 262 0 185 0 300 0 178 0 
    0 177 0 0 178 71 0 185 0 
    71 0 185 0 0 0 49 0 300 
    Solution is not unique

    284 0 0 0 0 193 25 179 0 
    32 25 193 179 284 0 0 0 0 
    0 0 0 92 25 0 296 0 284 
    0 32 296 0 0 0 0 0 179 
    193 0 0 0 92 0 32 296 84 
    0 179 284 0 296 371 193 0 92 
    0 284 32 0 371 0 0 92 0 
    296 92 371 25 179 0 0 0 193 
    179 0 84 296 0 0 371 0 0

唯一解

    284 296 92 371 84 193 25 179 32 
    32 25 193 179 284 296 92 84 371 
    371 84 179 92 25 32 296 193 284 
    92 32 296 84 193 25 284 371 179 
    193 371 25 284 92 179 32 296 84 
    84 179 284 32 296 371 193 25 92 
    25 284 32 193 371 84 179 92 296 
    296 92 371 25 179 284 84 32 193 
    179 193 84 296 32 92 371 284 25 

最后的输出由构造函数打印。

已更新class

public class Sudoku {

    private SudokuGen sudoku;

    public Sudoku(){

        SudokuGen auxSudoku = new SudokuGen();

        while (!createUniqueSolution(auxSudoku)){
            auxSudoku = new SudokuGen();
        }
        this.sudoku.getMyboard().showSudokuMatrix();
    }

    private boolean createUniqueSolution(SudokuGen sudoku){

        this.sudoku = new SudokuGen(sudoku);
        this.sudoku.getMyboard().showSudokuMatrix();
        Position availableMove = sudoku.getFirstAvailableMove();
        while (availableMove != null){
            int row,col;
            row = availableMove.getX();
            col = availableMove.getY();
            Integer value = sudoku.getValidvalue(row, col, 0);
            sudoku.makeMove(row, col, value);
            sudoku.loadValidvalues();
            availableMove = sudoku.getFirstAvailableMove();
        }
        if (sudoku.getSolved()){

            System.out.println("Unique solution");
            return true;
        }
        else{
            System.out.println("Solution is not unique");
            return false;
        }
    }

    public void setSudoku(SudokuGen sudoku){
        this.sudoku = sudoku;
    }

    public SudokuGen getSudoku(){
        return (this.sudoku);
    }

}

以及数独生成器的复制构造函数:

public SudokuGen(SudokuGen sudoku){
    this.genboard = sudoku.genboard;
    this.lockedCells = sudoku.lockedCells;
    this.mutableCells = sudoku.mutableCells;
    this.mutable = sudoku.mutable;
    this.myboard = sudoku.myboard;
    this.Solved = sudoku.Solved;
    this.validvalues = sudoku.validvalues;

}

setSudoku() 方法不会创建 SudokuGen 对象的副本,而是将现有对象附加到父对象。

你想要的是为 class SudokuGen 创建一个复制构造函数,这样你就可以将行 this.sudoku = sudoku; 更改为 this.sudoku = new SudokuGen (sudoku);