*解题思路:
1:dfs题
2:从第一个空格开始填数,只填能填的数(这是一个需要判断的过程,需要边走边判断),如果当前空格填不了数字了,就退回到前一个空格能填的下一个数(回溯),直到最后一个空填上数字,就结束了。*
以下是java代码:
package 位运算;
import java.util.Scanner;
public class 数独 {
public static void main(String[] args) {
Shudu shudu = new Shudu();
}
}
class Shudu{
boolean[] panduan = new boolean[10];
int[][] map=new int[10][10];
public Shudu(){
Scanner sca = new Scanner(System.in);
for(int i = 1;i<=9;i++){
for(int j = 1;j<=9;j++){
map[i][j] = sca.nextInt();
}
}
for(int i=0;i<=9;i++){
panduan[i]=false;
}
dfs(1, 1);
System.out.println("执行结束");
}
public void dfs(int m,int n){
for(int i = 1;i<=9;i++){
panduan[i] = false;
}
if(m==10){
System.out.println("有解");
for(int i=1;i<=9;i++){
for(int j=1;j<=9;j++){
System.out.print(map[i][j]);
}
System.out.println();
}
}
else{
judge(m, n);
for(int i = 1;i<=9;i++){//核心步骤
if(panduan[i]==false){
if(map[m][n]!=0){
if(n==9){
dfs(m+1, 1);
}else{
dfs(m, n+1);
}
}else{
map[m][n] = i;
if(n==9){
dfs(m+1,1);
}else{
dfs(m,n+1);
}
}
}
}
map[m][n] = 0;
return;
}
}
public void judge(int x,int y){//用于找出当前点能填的数
int fromX = (x-1)/3*3+1;
int toX = (x-1)/3*3+3;
int fromY = (y-1)/3*3+1;
int toY = (y-1)/3*3+3;
for(int i = fromX;i<=toX;i++){
for(int j = fromY;j<=toY;j++){
panduan[map[i][j]] = true;
}
}
for(int i=1;i<=9;i++){
panduan[map[i][y]] = true;
panduan[map[x][i]] = true;
}
}
}