题目
分析
public class Solution {
//数独游戏
public void solveSudoku(char[][] board) {
helper(board);
}
//这里的返回值用于指示是否找到一组正确的解,
//如果找到一组解,则程序就可以结束而不至于回溯所有情况
public boolean helper(char[][] board) {
for(int i = 0; i < board.length; i++) {
for(int j = 0; j < board[0].length; j++) {
//只有空格是.才可以放置数字
if(board[i][j] != '.') {
continue;
}
//每个位置可以放置1~9,遍历所有可能放置情况
for(char k = '1'; k <= '9'; k++) {
//检验当前放置的数字的合法性
if(isvaild(i,j,k,board)) {
//放置当前数字
board[i][j] = k;
//判断在当前位置放置k时,后续其它空格是否能够找到一组合法的解
if(helper(board)) {
return true;
}
}
}
//如果在当前位置放置所有数字均不合法,则向上回溯
board[i][j] = '.';
return false;
}
}
return true;
}
//判断num填入(row,col)位置是否合法
public boolean isvaild(int row,int col,char num,char[][] board) {
//判断行是否合法
int rowLen = board.length;
int colLen = board[0].length;
for(int i = 0; i < colLen; i++) {
if(board[row][i] == num) {
return false;
}
}
//判断列是否合法
for(int i = 0; i < rowLen; i++) {
if(board[i][col] == num) {
return false;
}
}
//判断九宫格内是否合法
//获取当前位置所在九宫格的起始位置
int x = (row / 3) *3;
int y = (col / 3) * 3;
for(int i = x; i < x + 3;i++) {
for(int j = y; j < y + 3; j++) {
if(board[i][j] == num) {
return false;
}
}
}
return true;
}
}