/***数独程序*/publicclassShuDu{/**存储数字的数组*/staticint[][]n=newint[9][9];/**生成随机数字的源数组,随机数字从该数组中产生*/staticint[]num={1,2,3,4,5,6,7,8,9};publicstaticvoidmain(String[]args){//生成数字for(inti=0;i9;i++){//尝试填充的数字次数inttime=0;//填充数字for(intj=0;j9;j++){//产生数字n[i][j]=generateNum(time);//如果返回值为0,则代表卡住,退回处理//退回处理的原则是:如果不是第一列,则先倒退到前一列,否则倒退到前一行的最后一列if(n[i][j]==0){//不是第一列,则倒退一列if(j0){j-=2;continue;}else{//是第一列,则倒退到上一行的最后一列i--;j=8;continue;}}//填充成功if(isCorret(i,j)){//初始化time,为下一次填充做准备time=0;}else{//继续填充//次数增加1time++;//继续填充当前格j--;}}}//输出结果for(inti=0;i9;i++){for(intj=0;j9;j++){System.out.print(n[i][j]+);}System.out.println();}}/***是否满足行、列和3X3区域不重复的要求*@paramrow行号*@paramcol列号*@returntrue代表符合要求*/publicstaticbooleanisCorret(introw,intcol){return(checkRow(row)&checkLine(col)&checkNine(row,col));}/***检查行是否符合要求*@paramrow检查的行号*@returntrue代表符合要求*/publicstaticbooleancheckRow(introw){for(intj=0;j8;j++){if(n[row][j]==0){continue;}for(intk=j+1;k9;k++){if(n[row][j]==n[row][k]){returnfalse;}}}returntrue;}/***检查列是否符合要求*@paramcol检查的列号*@returntrue代表符合要求*/publicstaticbooleancheckLine(intcol){for(intj=0;j8;j++){if(n[j][col]==0){continue;}for(intk=j+1;k9;k++){if(n[j][col]==n[k][col]){returnfalse;}}}returntrue;}/***检查3X3区域是否符合要求*@paramrow检查的行号*@paramcol检查的列号*@returntrue代表符合要求*/publicstaticbooleancheckNine(introw,intcol){//获得左上角的坐标intj=row/3*3;intk=col/3*3;//循环比较for(inti=0;i8;i++){if(n[j+i/3][k+i%3]==0){continue;}for(intm=i+1;m9;m++){if(n[j+i/3][k+i%3]==n[j+m/3][k+m%3]){returnfalse;}}}returntrue;}/***产生1-9之间的随机数字*规则:生成的随机数字放置在数组8-time下标的位置,随着time的增加,已经尝试过的数字将不会在取到*说明:即第一次次是从所有数字中随机,第二次时从前八个数字中随机,依次类推,*这样既保证随机,也不会再重复取已经不符合要求的数字,提高程序的效率*这个规则是本算法的核心*@paramtime填充的次数,0代表第一次填充*@return*/publicstaticintgenerateNum(inttime){//第一次尝试时,初始化随机数字源数组if(time==0){for(inti=0;i9;i++){num[i]=i+1;}}//第10次填充,表明该位置已经卡住,则返回0,由主程序处理退回if(time==9){return0;}//不是第一次填充//生成随机数字,该数字是数组的下标,取数组num中该下标对应的数字为随机数字intranNum=(int)(Math.random()*(9-time));//把数字放置在数组倒数第time个位置,inttemp=num[8-time];num[8-time]=num[ranNum];num[ranNum]=temp;//返回数字returnnum[8-time];}}