蒜头君今天突然开始还念童年了,想回忆回忆童年。他记得自己小时候,有一个很火的游戏叫做数独。便开始来了一局紧张而又刺激的高阶数独。蒜头君做完发现没有正解,不知道对不对? 不知道聪明的你能否给出一个标准答案?
标准数独是由一个给与了提示数字的 9 \times 99×9 网格组成,我们只需将其空格填上数字,使得每一行,每一列以及每一个 3×3 宫都没有重复的数字出现。
测试数据
0 2 6 0 0 0 0 0 0
0 0 0 5 0 2 0 0 4
0 0 0 1 0 0 0 0 7
0 3 0 0 2 0 1 8 0
0 0 0 3 0 9 0 0 0
0 5 4 0 1 0 0 7 0
5 0 0 0 0 1 0 0 0
6 0 0 9 0 7 0 0 0
0 0 0 0 0 0 7 5 0
代码部分:
import java.util.*;
public class Main {
static char[][] s = new char[9][9];
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
for (int i = 0; i < 9; i++) {
String str = cin.nextLine();
String[] ss = str.split(" ");
for(int j=0;j<9;j++) {
s[i][j]=ss[j].charAt(0);
}
System.out.println();
}
s(0,0);
}
public static void s(int i,int j){
if(i==9) {//前9行匹配成功
for(int i1=0;i1<9;i1++) {
for(int j1=0;j1<9;j1++) {
System.out.print(s[i1][j1]+" ");
}
System.out.println();
}
return;
}
if(s[i][j]=='0') {
for(int k=0;k<9;k++) {//判断行
boolean a = true;
for(int l =0;l<9;l++) {
if(s[i][l]==(char)(k+1+'0')||s[l][j]==(char)(k+1+'0')) {//**一个i行,一个j列!!
a = false;
break;
}
}
if(a) {
for(int m = (i/3)*3;m<(i/3)*3+3;m++) {//判断九宫格有无
for(int n = (j/3)*3;n<(j/3)*3+3;n++) {
if(s[m][n]==(char)(k+1+'0')) {
a=false;
break;
}
}
}
}
if(!a)//判断该数是否出现,出现则跳出循环,否则继续;
continue;
s[i][j]=(char)(k+1+'0');//赋值
if(j==8) {
s(i+1,0);
}
else {
s(i,j+1);
}
s[i][j]='0';//回溯;!!必须要有,否侧达不到要求返回上一步时无法继续取新值进行下一步
}
}
else {//该位置有值
if(j==8) {
s(i+1,0);
}
else {
s(i,j+1);
}
}
}
}