题目
编写一个程序,通过填充空单元格来解决数独谜题。 空单元格由字符'.'表示。 你可可以认为只有一个独特的解决方案。
分析
该题类似于八皇后问题
代码实现
public class Solution {
public void solveSudoku(char[][] board) {
if(board==null || board.length==0 || board[0].length==0) return ;
solve(board,0);
}
public boolean solve(char [][] board , int step){
if(step == 81){
return isValidate(board);
}else{
//根据step确定行,列
int x=step/9;
int y=step%9;
if(board[x][y]!='.'){
//// 如果x,y处不是'.'那么直接进一步深度搜索
return solve(board,step+1);
}else{
// 需要填写数字,填写1-9判断是不是有效的数独输入
for(int i=1;i<10;i++){
board[x][y]=(char)(i+'0');
if(isValidate(board)){
if(solve(board,step+1)){
return true;
}
}
board[x][y]='.';
}
return false;
}
}
}
public boolean isValidate(char [][] board){
//行遍历与列遍历验证
for(int i = 0;i < 9;i++){
int [] num1 = new int [9];
for(int j = 0;j < 9;j++){
if(board[i][j] != '.'){
if(num1[(int)(board[i][j]-'1')] == 1){
return false;
}else{
num1[(int)(board[i][j]-'1')] = 1;
}
}
}
int [] num2 = new int [9];
for(int j = 0;j < 9;j++){
if(board[j][i] != '.'){
if(num2[(int)(board[j][i]-'1')] == 1){
return false;
}else{
num2[(int)(board[j][i]-'1')] = 1;
}
}
}
}
//小九宫格遍历验证
for(int i = 0; i < 3;i++){
for(int j = 0;j < 3;j++){
int [] num = new int [9];
// 九宫格遍历
for(int k1 = 0; k1 < 3;k1++){
for(int k2 = 0;k2 < 3;k2++){
if(board[i*3+k1][j*3+k2] != '.'){
if(num[(int)(board[i*3+k1][j*3+k2]-'1')]==1){
return false;
}else{
num[(int)(board[i*3+k1][j*3+k2]-'1')]=1;
}
}
}
}
}
}
return true;
}
}
题目来自牛客网leetcode