这题的原地旋转算法, 关键在于理解四数之间的旋转也只需要一个tmp.
// A B
// C D
// C A
// D B
// A = C, C = D, D = B, B = A, 显然, 发现只需要保存A为tmp, 并且只需要遍历四分之一的图像范围即可
这题的核心思路就是回溯, 但仍然没能独立写出来, 原因是在这道题的场景中, return是远远不如设置一个全局的valid布尔值来得强大的, return只能终止一个循环, 只有valid才能够终止所有81个方法中的81个for循环, 否则但凡还有一个for循环活着还在继续回溯, 结果都会不对
class Solution {
List<int[]> space = new ArrayList<>();
boolean[][] row = new boolean[9][9];
boolean[][] column = new boolean[9][9];
boolean[][][] sudoku = new boolean[3][3][9];
boolean valid;
public void solveSudoku(char[][] board) {
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
if (board[i][j] == '.') {
space.add(new int[]{i, j});
} else {
row[i][board[i][j]-'1'] = true;
column[j][board[i][j]-'1'] = true;
sudoku[i/3][j/3][board[i][j]-'1'] = true;
}
}
}
dfs(board, 0);
}
public void dfs(char[][] board, int num) {
if (num >= space.size()) {
valid = true;
return;
}
int[] cur = space.get(num);
int r = cur[0];
int c = cur[1];
for (int i = 0; i < 9 && !valid; i++) {
if (!row[r][i] && !column[c][i] && !sudoku[r/3][c/3][i]) {
board[r][c] = (char)(i + '1');
row[r][i] = true;
column[c][i] = true;
sudoku[r/3][c/3][i] = true;
dfs(board, num + 1);
row[r][i] = false;
column[c][i] = false;
sudoku[r/3][c/3][i] = false;
}
}
}
}