题目:
数独是一个我们都非常熟悉的经典游戏,运用计算机我们可以很快地解开数独难题,现在有一些简单的数独题目,请编写一个程序求解。
输入:
输入9行,每行为空格隔开的9个数字,为0的地方就是需要填充的。
输出:
输出九行,每行九个空格隔开的数字,为解出的答案。
解析:
1 . 老实讲,题目本身就有问题,要想完全通过,只能看人品的东西,所以我有点不想尝试了,因为就算是尝试了,可能也没有个结果,不过没事,试试看嘛。
2 . 暴力破解是个好方法,不过我觉得还是不怎么样,如果暴力破解都ok,那这个题目本身就没什么意义了。
解题所需函数:
1 . 创建ArrayList链表
ArrayList<HashSet<Integer>> row=new ArrayList<HashSet<Integer>>();
ArrayList<HashSet<Integer>> col=new ArrayList<HashSet<Integer>>();
ArrayList<HashSet<Integer>> squ=new ArrayList<HashSet<Integer>>();
代码:
import java.util.*;
// 创建主函数,没毛病
public class Main{
public static void main(String[] args){
// 创建Scanner来获取数据
Scanner sc=new Scanner(System.in);
// 多个测试用例的时候,那么我就多读取两次嘛
while(sc.hasNext()){
// 创建9*9数组
int[][] data=new int[9][9];
// 创建链表,链表结构是Integer的HashSet,用于存储数据(行数据,纵数据,方格数据),怎么说呢,评判标准嘛
ArrayList<HashSet<Integer>> row=new ArrayList<HashSet<Integer>>();
ArrayList<HashSet<Integer>> col=new ArrayList<HashSet<Integer>>();
ArrayList<HashSet<Integer>> squ=new ArrayList<HashSet<Integer>>();
// 初始化,也没啥毛病,添加new HashSet<Integer>
for(int i=0;i<9;i++){
row.add(new HashSet<Integer>());
col.add(new HashSet<Integer>());
squ.add(new HashSet<Integer>());
}
// 遍历9*9数组,添加数据
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]);
// 这个就是将9*9拆分成9个3*3用于判断,是否符合要求的哟
squ.get(i/3*3+j/3).add(data[i][j]);
}
}
}
// 核心思想,暴力破解,么么哒 参数:数据,横纵方格和序列号index
dfs(data,row,col,squ,0);
// 双for循环,打印数据
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();
}
// 函数,返回布尔值,如果是true,说明数独完整,那么就这样吧,没毛病
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循环1到9
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;
}
}
}