废话少说,直接贴代码: //--------------------------------// //作者:不喝橙汁 //完成日期:09.12.30 //--------------------------------// public class Suduku_Core { private int[] hole=new int[81]; private int[][] test=new int[9][9]; private int nHole,N,num,X,Y,FillNum,Cnum; //Generator方法 //产生原始填充数独 private void Generator() { Cnum=0;N=9;nHole=0; int count=0; num=10+(int)(Math.random()*6); //产生10到16之间的随机数,不包括16,也就是10到15的整数 //while循环 //尝试在数组中填入符合数独规则的数字 //以此来减少树的分支,提高效率 while(count!=num) { X=(int)(Math.random()*9); Y=(int)(Math.random()*9); FillNum=1+(int)(Math.random()*9); if(bPack(X,Y,FillNum)) { test[X][Y]=FillNum; count++; } } } //bPack方法 //判断是否可将 n 填入 M[y][x] 里 private boolean bPack (int x, int y, int n) { //for循环 //纵横判断 for (int i=0; i<N; i++) //若 M[0~N-1][x] if (n == test[x][i] || n == test[i][y]) //或 M[y][0~N-1] 中已存在 n return false; //则返回 false //for循环 //区域判断 int D_X,D_Y,OrderNum; OrderNum=9*(x+1)+(y+1); D_X=((int)(x/3))*3; D_Y=((int)(y/3))*3; for(int count=0;count != 9;count++) { if(D_X==x && D_Y==y) continue; if(test[(D_X+count/3)][(D_Y+count%3)]==n) return false; } //返回结果 return true; } //fill方法 //此方法用来填充完整已有数子的数独 private void fill(int num) { if(Cnum==81) { print(); return; //表示填满返回 } if(test[Cnum/9][Cnum%9]!=0) { ++Cnum; fill(Cnum); //位置不为0,填充下一个 return; } else { //从1到9里面选择数字填进去 for(int x=1;x!=11;x++) //x=10 是哨兵 { if(Cnum==81) { return; //表示填满返回 } if(x==10 && Cnum!=0) { --Cnum; test[(Cnum/9)][(Cnum%9)]=0; return; } if(bPack((Cnum/9),(Cnum%9),x)) { test[(Cnum/9)][(Cnum%9)]=x; ++Cnum; fill(Cnum); } } } } //print方法 //打印数组到屏幕 private void print() { for(int m=0;m<9;m++) { System.out.println(); for(int n=0;n<9;n++) { System.out.print(test[m][n]); } } } //getArry方法 //获取生成的数组 public int[][] getArry() { Generator(); //print(); //此时打印的是原始的数独数组 fill(Cnum); //print(); //此时打印的是填充完整的数独 //cout<<endl<<"OVER"; System.out.println(); System.out.println("OVER"); //打印完毕 return test; } public static void main(String args[]) { Suduku_Core test=new Suduku_Core(); test.getArry(); } }; 附:数独规则