题目描述:
解答:
其中用到了递归,并且是一个一个按顺序进行放置值,如果值不符合要求就下一步
class Solution {
public boolean finished = false;
public void solveSudoku(char[][] board) {
List<int[]> empty_positions = new ArrayList<>();
boolean[][] row_used_list = new boolean[9][9];
boolean[][] column_used_list = new boolean[9][9];
boolean[][] box_used_list = new boolean[9][9];
for(int i = 0; i < 9; i++) {
for(int j = 0; j < 9; j++) {
if(board[i][j] == '.')
empty_positions.add(new int[] {i, j});
else {
row_used_list[i][board[i][j] - '1'] = true;
column_used_list[j][board[i][j] - '1'] = true;
box_used_list[(i / 3) * 3 + (j / 3)][board[i][j] - '1'] = true;
}
}
}
fillEmptyCell(board, 0, empty_positions, row_used_list, column_used_list, box_used_list);
return;
}
public void fillEmptyCell(char[][] board, int listIdx, List<int[]> positions, boolean[][] row_used_list,
boolean[][] column_used_list, boolean[][] box_used_list) {
if(listIdx == positions.size()) {
finished = true;
return;
}
else {
int r = positions.get(listIdx)[0];
int c = positions.get(listIdx)[1];
for(int i = 0; i < 9; i++) {
if(isValid(i, row_used_list[r], column_used_list[c], box_used_list[(r / 3) * 3 + (c / 3)])) {
row_used_list[r][i] = true;
column_used_list[c][i] = true;
box_used_list[(r / 3) * 3 + (c / 3)][i] = true;
board[r][c] = (char)(i + '1');
fillEmptyCell(board, listIdx + 1, positions, row_used_list, column_used_list, box_used_list);
if(finished)
return;
row_used_list[r][i] = false;
column_used_list[c][i] = false;
box_used_list[(r / 3) * 3 + (c / 3)][i] = false;
}
}
return;
}
}
public boolean isValid(int value, boolean[] row_used, boolean[] column_used, boolean[] box_used) {
if(row_used[value])
return false;
if(column_used[value])
return false;
if(box_used[value])
return false;
return true;
}
}
运行结果: