接触数独这个游戏是最近一段时间,但苦苦思索程序算法终无结果,今早一袭灵感给了我很大启发,经过一天的调试和测试,终于有点成就,但还不够完善,现贴出来源代码如下:
import java.util.ArrayList;
import java.util.List;
public class Sudoku {
public static List b=new ArrayList();
public boolean Insert(int[][] a){
if(MaxRow(a)==-1){
Copy(a,b);
//if(!Contains(a,b))
//Print(b);
return true;
}
int p=MaxRow(a);
int q=0;
for(int j=0;j<9;j++)
if(a[p][j]==0)
{q=j;break;}
for(int i=1;i<10;i++)
if(CanInsert(a,p,q,i)){
a[p][q]=i;
Insert(a);
a[p][q]=0;
}
return true;
}
public void Print(List a){
for(int i=0;i<a.size();i++){
System.out.println("======================第"+i+1+"条========================");
for(int t=0;t<81;t++){
if(t%9==0)System.out.println();
System.out.print(a.get(i).toString().charAt(t)+" ");
}
System.out.println();
}
System.out.println("============================================================");
}
public int MaxRow(int[][] a){//已填了数字格最多的行
int q=0;
int t=-1;
int i=0,j=0;
for(i=0;i<9;i++){
int p=0;
for(j=0;j<9;j++)
if(a[i][j]!=0)p++;
if(p!=9&&p>=q){q=p;t=i;}
}
return t;
}
public void Copy(int[][] a ,List b){
StringBuffer bs=new StringBuffer();
for(int i=0;i<9;i++)
for (int j=0;j<9;j++)
bs.append(a[i][j]);
if(!b.contains(bs.toString()))b.add(bs.toString());
}
public boolean Contains(int[][] a ,List b){
StringBuffer bs=new StringBuffer();
for(int i=0;i<9;i++)
for (int j=0;j<9;j++)
bs.append(a[i][j]);
if(!b.contains(bs.toString()))return true;
return false;
}
public boolean CanInsert(int[][] a,int p,int q,int r){//数字r能否填在a[p][q]格子中
boolean flag=true;
for(int j=0;j<9;j++)
if(a[p][j]==r)flag=false;
for(int j=0;j<9;j++)
if(a[j][q]==r)flag=false;
for(int i=(p/3)*3;i<=(p/3)*3+2;i++)
for(int j=(q/3)*3;j<=(q/3)*3+2;j++)
if(a[i][j]==r)flag=false;
return flag;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int[][] a=new int[9][9];
a[0]=new int[]{9,0,0,0,0,5,0,0,7};
a[1]=new int[]{3,0,0,0,6,0,2,0,0};
a[2]=new int[]{1,0,0,8,0,0,0,4,0};
a[3]=new int[]{6,0,0,0,0,0,0,0,1};
a[4]=new int[]{0,0,0,5,0,3,0,0,0};
a[5]=new int[]{2,0,0,0,0,0,0,0,9};
a[6]=new int[]{0,9,0,0,0,7,0,0,3};
a[7]=new int[]{0,0,8,0,4,0,0,0,6};
a[8]=new int[]{5,0,0,1,0,0,0,0,2};
int[][] b=new int[9][9];
Sudoku s=new Sudoku();
s.Insert(a);
s.Print(s.b);
System.out.println("共计有结果数:"+s.b.size());
}
}