题目描述
判断一个 9x9
的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。
- 数字
1-9
在每一行只能出现一次。 - 数字
1-9
在每一列只能出现一次。 - 数字
1-9
在每一个以粗实线分隔的3x3
宫内只能出现一次。
一个数独。
答案被标成红色。
Note:
- 给定的数独序列只包含数字
1-9
和字符'.'
。 - 你可以假设给定的数独只有唯一解。
- 给定数独永远是
9x9
形式的。
样例
输入:
[
["5","3",".",".","7",".",".",".","."],
["6",".",".","1","9","5",".",".","."],
[".","9","8",".",".",".",".","6","."],
["8",".",".",".","6",".",".",".","3"],
["4",".",".","8",".","3",".",".","1"],
["7",".",".",".","2",".",".",".","6"],
[".","6",".",".",".",".","2","8","."],
[".",".",".","4","1","9",".",".","5"],
[".",".",".",".","8",".",".","7","9"]
]
输出:
[
["5","3","4","6","7","8","9","1","2"],
["6","7","2","1","9","5","3","4","8"],
["1","9","8","3","4","2","5","6","7"],
["8","5","9","7","6","1","4","2","3"],
["4","2","6","8","5","3","7","9","1"],
["7","1","3","9","2","4","8","5","6"],
["9","6","1","5","3","7","2","8","4"],
["2","8","7","4","1","9","6","3","5"],
["3","4","5","2","8","6","1","7","9"]
]
算法分析
dfs
- 1、预处理出
row
,col
,cell
数组,某些元素的位置已经被标识过 - 2、
dfs
从(0,0)
到(8,8)
按顺序递归,假设递归到当前位置是(i,j)
若该位置已经被表示过,则直接跳去下一个位置
若该位置未被表示过,则往该位置尝试填1
到9
的数字,并在row
,col
,cell
数组中进行标记,用完记得恢复现场 - 3、当能成功到达最后一个位置,直接返回
true
,结束递归
时间复杂度
不好分析
Java 代码
class Solution {
static boolean dfs(char[][] board,boolean[][] row,boolean[][] col,boolean[][][] cell,int x,int y)
{
//判断边界
if(y == 9)
{
x ++;
y = 0;
if(x == 9) return true;
}
if(board[x][y] != '.') return dfs(board,row,col,cell,x,y + 1);
//尝试填数
for(int i = 1;i <= 9;i ++)
{
if(row[x][i] || col[y][i] || cell[x / 3][y / 3][i]) continue;
board[x][y] = (char)('0' + i);
row[x][i] = col[y][i] = cell[x / 3][y / 3][i] = true;
if(dfs(board,row,col,cell,x,y + 1)) return true;
board[x][y] = '.';
row[x][i] = col[y][i] = cell[x / 3][y / 3][i] = false;
}
return false;
}
public void solveSudoku(char[][] board) {
boolean[][] row = new boolean[10][10];
boolean[][] col = new boolean[10][10];
boolean[][][] cell = new boolean[3][3][10];
//初始化
for(int i = 0;i < 9;i ++)
for(int j = 0;j < 9;j ++)
{
if(board[i][j] != '.')
{
int t = board[i][j] - '0';
row[i][t] = col[j][t] = cell[i / 3][j / 3][t] = true;
}
}
dfs(board,row,col,cell,0,0);
}
}