题目:
数独定义:数独(shù dú)是源自18世纪瑞士的一种数学游戏。是一种运用纸、笔进行演算的逻辑游戏。玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个粗线宫(3*3)内的数字均含1-9,不重复。
数独是一个我们都非常熟悉的经典游戏,运用计算机我们可以很快地解开数独难题,现在有一些简单的数独题目,请编写一个程序求解。
如有多解,输出一个解
输入描述:
输入9行,每行为空格隔开的9个数字,为0的地方就是需要填充的。
7 2 6 9 0 4 0 5 1
0 8 0 6 0 7 4 3 2
3 4 1 0 8 5 0 0 9
0 5 2 4 6 8 0 0 7
0 3 7 0 0 0 6 8 0
0 9 0 0 0 3 0 1 0
0 0 0 0 0 0 0 0 0
9 0 0 0 2 1 5 0 0
8 0 0 3 0 0 0 0 0
输出描述:
输出九行,每行九个空格隔开的数字,为解出的答案。
7 2 6 9 3 4 8 5 1
5 8 9 6 1 7 4 3 2
3 4 1 2 8 5 7 6 9
1 5 2 4 6 8 3 9 7
4 3 7 1 9 2 6 8 5
6 9 8 5 7 3 2 1 4
2 1 5 8 4 6 9 7 3
9 6 3 7 2 1 5 4 8
8 7 4 3 5 9 1 2 6
题解:(还没有看)
package test;
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
int[][] data=new int[9][9];
ArrayList<HashSet<Integer>> row=new ArrayList<HashSet<Integer>>();
ArrayList<HashSet<Integer>> col=new ArrayList<HashSet<Integer>>();
ArrayList<HashSet<Integer>> squ=new ArrayList<HashSet<Integer>>();
for(int i=0;i<9;i++){
row.add(new HashSet<Integer>());
col.add(new HashSet<Integer>());
squ.add(new HashSet<Integer>());
}
for(int i=0;i<9;i++){
for(int j=0;j<9;j++){
data[i][j]=sc.nextInt();
if(data[i][j]!=0){
row.get(i).add(data[i][j]);
col.get(j).add(data[i][j]);
squ.get(i/3*3+j/3).add(data[i][j]);//这里没看懂
}
}
}
dfs(data,row,col,squ,0);
for(int i=0;i<9;i++){
for(int j=0;j<9;j++){
if(j!=8)
System.out.print(data[i][j]+" ");
else
System.out.println(data[i][j]);
}
}
}
sc.close();
}
public static boolean dfs(int[][] data,ArrayList<HashSet<Integer>> row,ArrayList<HashSet<Integer>> col,ArrayList<HashSet<Integer>> squ,int index){
if(index==81)
return true;
int m=index/9;
int n=index%9;
int k=m/3*3+n/3;
if(data[m][n]!=0){
return dfs(data,row,col,squ,index+1);
}
else{
for(int i=1;i<=9;i++){
if(!row.get(m).contains(i) && !col.get(n).contains(i) && !squ.get(k).contains(i)){
data[m][n]=i;
row.get(m).add(i);
col.get(n).add(i);
squ.get(k).add(i);
if(dfs(data,row,col,squ,index+1))
return true;
data[m][n]=0;
row.get(m).remove(i);
col.get(n).remove(i);
squ.get(k).remove(i);
}
}
return false;
}
}
}