Java - 2d数组的意外行为

时间:2014-11-18 23:40:58

标签: java arrays recursion

我写的以下代码解决了数独。我在这里遇到了意想不到的行为。我两次调用displaySudokuBoard。一个来自sudokuFiller,当i值变得大于8(我得到解决的数独数组)和另一个来自main函数的调用(它返回给我相同的数组作为输入)。

为什么我得到不同的数组值。代码有什么问题

class SudokuSolver {

public int[][] sudokuBoard = {{2, 0, 0, 0, 0, 1, 0, 3, 8},
                              {0, 0, 0, 0, 0, 0, 0, 0, 5},
                              {0, 7, 0, 0, 0, 6, 0, 0, 0},
                              {0, 0, 0, 0, 0, 0, 0, 1, 3},
                              {0, 9, 8, 1, 0, 0, 2, 5, 7},
                              {3, 1, 0, 0, 0, 0, 8, 0, 0},
                              {9, 0, 0, 8, 0, 0, 0, 2, 0},
                              {0, 5, 0, 0, 6, 9, 7, 8, 4},
                              {4, 0, 0, 2, 5, 0, 0, 0, 0}};

private boolean checkNumberExistInRow(int i, int cellVals) {
    for(int j = 0; j < 9; j++) {
        if(sudokuBoard[i][j] == cellVals) {
            return false ;
        }
    }
        return true;
}
private boolean checkNumberExistInColumn(int j, int cellVals) {
    for(int i = 0; i < 9; i++) {
        if(sudokuBoard[i][j] == cellVals) {
            return false;
        }
    }
    return true;
}
private boolean checkNumberExistInGrid(int i, int j, int cellVals) {
    i = (i / 3) * 3 ;
    j = (j / 3) * 3;
    for(int k = 0; k < 3; k++) {
        for(int s = 0; s < 3; s++) {
            if(sudokuBoard[i+k][j+s] == cellVals) {
                return false;
            }
        }
    }
    return true;
}
private void FillNext(int i, int j) {
    if(j < 8 ) {
        sudokuFiller(i, j+1);
    } else {
        sudokuFiller(i+1, 0);
    }
}
public void sudokuFiller (int i, int j) {
    int k = 0;
    if(i > 8) {
        displaySodukoBoard();
        return;
    }
    if(sudokuBoard[i][j] != 0) {
        FillNext(i, j);
    }
    else {
        for(int cellVals = 1; cellVals <= 9; cellVals++) {
            if((checkNumberExistInRow(i, cellVals)) && (checkNumberExistInColumn(j, cellVals)) && (checkNumberExistInGrid(i, j, cellVals))) {
                this.sudokuBoard[i][j] = cellVals;
                FillNext(i,j);
            }
        }
        this.sudokuBoard[i][j] = 0;
    }
}
public void displaySodukoBoard() {
    for(int row = 0; row < 9; ++row) {
        for(int col = 0; col < 9; ++col) {
            if ((col == 3) || (col == 6)){
                System.out.printf("\t");
            }
            System.out.printf("%d ",sudokuBoard[row][col]);
        }
        if ((row == 2) || (row == 5)){
            System.out.printf("\n");
        }
        System.out.print("\n");
    }
}
}

class FeedMeASudoku {
public static void main(String[] args) {

    SudokuSolver mySudokuSolver = new SudokuSolver();

    mySudokuSolver.sudokuFiller(0,0);
    System.out.print("\n");
    mySudokuSolver.displaySodukoBoard();

}
}

2 个答案:

答案 0 :(得分:0)

问题在于:this.sudokuBoard[i][j] = 0;。 在设置流程结束时,您将字段重置为0sudokuFiller(int i, int j)else - 语句,最后一行。)

编辑:这解决了部分问题。现在正确显示前三行。但是,递归确实会先发制人。现在您需要进一步调试代码。

答案 1 :(得分:0)

我假设您首先尝试显示电路板,然后显示新电路板的结果,这是您的解决方案。计算很好,但是电话的顺序是错误的。

Main()来电中,切换第二行和第四行:

SudokuSolver mySudokuSolver = new SudokuSolver();
mySudokuSolver.displaySodukoBoard();
System.out.print("\n");
mySudokuSolver.sudokuFiller(0,0);

另外,正如其他人建议的那样,您应该学习如何调试并从LINT中寻找建议。例如,您有未使用的变量int k = 0;