一开始的代码 helper是void 这样就会形成填了一遍 发现不对 就不再往下填了
helper需要是返回boolean 这样再填到最后 发现填完了 就返回true; 假如上一层返回false 并且这一层的1-9全都填完了还没返回true 那说明这一层怎么填都不行 就把这一层设置称为原来的'.' 并返回给上一层false;
public class Solution {
public void solveSudoku(char[][] board) {
int newRow = 0;
int newCol = 0;
while ( board[newRow][newCol] != '.' ){
newCol ++;
if ( newCol >= 9 ){
newRow ++;
newCol = 0;
}
}
helper ( board, newRow, newCol );
}
public boolean helper ( char[][] board, int row, int col ){
if ( row >= 9 )
return true;
for ( int i = 1; i <= 9; i ++ ){
if ( valid ( board, row, col, i ) ){
board [row][col] = (char)(i + '0');;
int newRow = row;
int newCol = col;
while ( board[newRow][newCol] != '.' ){
newCol ++;
if ( newCol >= 9 ){
newRow ++;
newCol = 0;
}
if ( newRow >=9 )
break;
}
if ( helper ( board, newRow, newCol ) )
return true;
board [row][col] = '.';
}
}
return false;
}
public boolean valid ( char [][] board, int row, int col, int n) {
//check row
for ( int i = 0; i < 9; i ++ ){
if ( board[row][i] == (char)(n + '0') && i != col )
return false;
}
//check col
for ( int i = 0; i < 9; i ++ ){
if ( board[i][col] == (char)(n + '0') && i != row )
return false;
}
//check square
for ( int i = row/3 * 3; i < (row/3 + 1) * 3; i ++ ){
for ( int j = col/3 * 3; j < (col/3 + 1) * 3; j ++ ){
if ( board[i][j] == (char)(n + '0') && i != row && j != col )
return false;
}
}
return true;
}
}