37. 解数独
难度:hard
对于二维数组的每一位需要从1遍历到9;
Java:
class Solution {
public void solveSudoku(char[][] board) {
backtracking(board);
}
public boolean backtracking(char[][] board) {
for (int i = 0; i < board.length; i++) {
for (int j = 0; j < board[0].length; j++) {
if (board[i][j] != '.') {
continue;
}
for (char k = '1'; k <= '9'; k++) {
if (isValid(board, i, j, k)) {
board[i][j] = k;
if (backtracking(board)) {
return true;
}
board[i][j] = '.';
}
}
return false;
}
}
return true;
}
public boolean isValid(char[][] board, int i, int j, char val) {
// 行
for (int k = 0; k < 9; k++) {
if (board[i][k] == val) {
return false;
}
}
// 列
for (int k = 0; k < 9; k++) {
if (board[k][j] == val) {
return false;
}
}
// 3*3宫
// 定位宫格最左上角的元素的坐标
int row = i / 3 * 3;
int col = j / 3 * 3;
for (int i2 = 0; i2 < 3; i2++) {
for (int j2 = 0; j2 < 3; j2++) {
if (board[row + i2][col + j2] == val)
return false;
}
}
return true;
}
}
失败代码:
class Solution {
int i = 0;
int j = 0;
public void solveSudoku(char[][] board) {
backtracking(board);
}
public boolean backtracking(char[][] board) {
if (i == 9 && j == 9) {
return true;
}
if (board[i][j] == '.') {
for (char k = '1'; k <= '9'; k++) {
if (isValid(board, i, j, k)) {
board[i][j] = k;
int tem1 = i;
int tem2 = j;
if (j == 8) {
j = 0;
i++;
} else {
j++;
}
if (backtracking(board)) {
return true;
}
board[i][j] = '.';
i = tem1;
j = tem2;
}
}
return false;
}
return true;
// for (int i = 0; i < board.length; i++) {
// for (int j = 0; j < board[0].length; j++) {
// if (board[i][j] != '.') {
// continue;
// }
// for (char k = '1'; k <= '9'; k++) {
// if (isValid(board, i, j, k)) {
// board[i][j] = k;
// if (backtracking(board)) {
// return true;
// }
// board[i][j] = '.';
// }
// }
// return false;
// }
// }
// return true;
}
public boolean isValid(char[][] board, int i, int j, char val) {
// 行
for (int k = 0; k < 9; k++) {
if (board[i][k] == val) {
return false;
}
}
// 列
for (int k = 0; k < 9; k++) {
if (board[k][j] == val) {
return false;
}
}
// 3*3宫
// 定位宫格最左上角的元素的坐标
int row = i / 3 * 3;
int col = j / 3 * 3;
for (int i2 = 0; i2 < 3; i2++) {
for (int j2 = 0; j2 < 3; j2++) {
if (board[row + i2][col + j2] == val)
return false;
}
}
return true;
}
}