(leetcode)解数独-DFS
Posted nuist__NJUPT
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(leetcode)解数独-DFS相关的知识,希望对你有一定的参考价值。
编写一个程序,通过填充空格来解决数独问题。
数独的解法需 遵循如下规则:
数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)
数独部分空格内已填入了数字,空白格用 ‘.’ 表示。
public class DFS {
public static boolean isFinish = false;
public static boolean check(char [][]table, int x, int y, int i){
//检查table[x][y]填入i是否合法
for(int j=0; j<9; j++){
if(table[x][j] == ('0' + i)){ //table[x][y]所在行
return false ;
}
if(table[j][y] == ('0' + i)){ //table[x][y]所在列
return false ;
}
}
for(int j=(x/3)*3; j<(x/3+1)*3; j++){ //table[x][y]所在9宫格
for(int k=(y/3)*3; k<(y/3+1)*3; k++){
if(table[j][k] ==('0' + i)){
return false ;
}
}
}
return true ;
}
public static void dfs(char [][] table, int x, int y){
if(x == 9){
isFinish = true ;
return ;
}
if(table[x][y] == '.'){//当前位置没有元素
for(int i=1; i<=9; i++){ //将合法的字符填入当时空中
if(check(table,x,y,i)){
table[x][y] = (char)('0' + i) ;
dfs(table, x+ (y+1) / 9,(y+1)%9) ;//递归到下一个空
if(isFinish){ //完成后,层层返回
return ;
}
}
}
table[x][y] ='.' ; //回溯到上一次递归的位置
}else{ //当前位置有元素,递归到下个空
dfs(table, x+(y+1)/9, (y+1)%9) ;
}
}
public static void solve(char [][] table){
isFinish = false ;
dfs(table,0,0) ;
for(int i=0; i<9; i++){
for(int j=0; j<9; j++){
System.out.print(table[i][j] + " ") ;
}
System.out.println() ;
}
}
public static void main(String[] args){
char[][] table = new char[][]{
{'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'}
} ;
solve(table) ;
}
}
以上是关于(leetcode)解数独-DFS的主要内容,如果未能解决你的问题,请参考以下文章