题目:
你一定听说过“数独”游戏。如【图1.png】,玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个同色九宫内的数字均含1-9,不重复。
数独的答案都是唯一的,所以,多个解也称为无解。
本图的数字据说是芬兰数学家花了3个月的时间设计出来的较难的题目。但对会使用计算机编程的你来说,恐怕易如反掌了。
本题的要求就是输入数独题目,程序输出数独的唯一解。我们保证所有已知数据的格式都是合法的,并且题目有唯一的解。
格式要求,输入9行,每行9个字符,0代表未知,其它数字为已知。
输出9行,每行9个数字表示数独的解。
例如:
输入(即图中题目):
005300000
800000020
070010500
400005300
010070006
003200080
060500009
004000030
000009700
程序应该输出:145327698
839654127
672918543
496185372
218473956
753296481
367542819
984761235
521839764
再例如,输入:
800000000
003600000
070090200
050007000
000045700
000100030
001000068
008500010
090000400
程序应该输出:
812753649
943682175
答案:
import java.util.Scanner; public class Main { public static void main(String[] args){ Scanner in=new Scanner(System.in); int[][] arr=new int[9][9]; String[] ar=new String[9]; for(int i=0;i<9;i++){ ar[i]=in.next(); } for(int i=0;i<9;i++){ for(int j=0;j<9;j++){ arr[i][j]=(ar[i].charAt(j)-48); } } //以上为输出数据到二维数组,注意到输入数据没有空格,所以只能从字符串转换成数字 p(arr,0,0);//递归 } public static void p(int[][] arr,int i,int j){ if(j==9){//如果到最后一行了,跳到下一列第一行 p(arr,i+1,0); return; } if(i==9){//如果到最后一列,输出 for(int i1=0;i1<9;i1++){ for(int j1=0;j1<9;j1++){ System.out.print(arr[i1][j1]); } System.out.println(); } return; } if(arr[i][j]!=0){//如果此格有数字,跳下一格 p(arr,i,j+1); return; } for(int x=1;x<=9;x++){//开始填数 boolean bo=true; for(int i1=0;i1<9;i1++){//判断行列有没有一样的数 if(arr[i][i1]==x||arr[i1][j]==x){ bo=false; break; } } int i1,j1; if(i<3) i1=0; else if(i<6) i1=3; else i1=6; if(j<3) j1=0; else if(j<6) j1=3; else j1=6; for(int ii=0;ii<3&&bo;ii++){//判断九宫格内有没有一样的数 for(int jj=0;jj<3&&bo;jj++){ if(arr[i1+ii][j1+jj]==x){ bo=false; } } } if(bo){ arr[i][j]=x; p(arr,i,j+1); arr[i][j]=0; } } return;//此格无法填数,当前线程结束 } }
分析:因为内存和时间都不会超时,所以问题不大,递归穷举即可。
总结:
1.注意输入和输出的格式,否则很有可能导致输入的数据无法成功读取,或者输出错误零分。
2.当时间空间都不会出现超额,那就大胆的写代码,做出正确结果即可。