我写的以下代码解决了数独。我在这里遇到了意想不到的行为。我两次调用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();
}
}
答案 0 :(得分:0)
问题在于:this.sudokuBoard[i][j] = 0;
。
在设置流程结束时,您将字段重置为0
(sudokuFiller(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;