题目:玩家需要根据9*9盘上的已知数字,推理出所有剩余空格的数字,并满足每一行,每一列,每一个同色九宫内的数字均含有1-9,不重复
005300000
800000020
070010500
400005300
010070006
003200080
060500009
004000030
000009700
描述:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Scanner sc = new Scanner(System.in);
/* int a = sc.nextInt();
int b = sc.nextInt(); */
char arr[][] = new char[9][9];
for(int i=0;i<9;i++) {
String str = sc.next();
arr[i] = str.toCharArray();
}
/* for(int i=0;i<a;i++) {
System.out.println(arr[i]);
}*/
dfs(arr,0,0);
}
public static void dfs(char arr[][],int x,int y) {
//出口
if(x==9 ) {
for(int i=0;i<9;i++) {
System.out.println(arr[i]);
}
return;
}
//测试这个位置能不能放
if(arr[x][y]=='0') {
//放入1-9
for(int i=1;i<10;i++) {
//检查是否有重复
boolean flag = check(arr,x,y,i);
//如果在规定的格式内都没有重复的话
if(flag) {
//将i放入
arr[x][y] = (char)('0'+i);
//然后检查下一个格子
dfs(arr,x+(y+1)/9,(y+1)%9);
}
}
//放完之后回溯
arr[x][y] = '0';
//如果该格子不能放了数字的话,接着走下一行
}else {
dfs(arr,x+(y+1)/9,(y+1)%9);
}
}
public static boolean check(char arr[][],int x,int y,int i) {
char ch = (char)('0'+i);
//检查同行,同列
for(int m=0;m<9;m++) {
if(arr[x][m]==ch) return false;
if(arr[m][y]==ch) return false;
}
//检查同一个九宫格
for(int m=(x/3)*3;m<(x/3+1)*3;m++) {
for(int n=(y/3)*3;n<(y/3+1)*3;n++) {
if(arr[m][n]==ch) return false;
}
}
return true;
}
}