【java练习】生成一张数独表吧!

来源:互联网 发布:淘宝集运德国 编辑:程序博客网 时间:2024/05/31 06:23

练习

随机生成一张数独表练习。反正看起来效率不高就是了=A=。。。
总体思想就是一行一行的随机。一行中随机出一个数判断一下这行有没有;开始下一行之前判断这行有没有和上面的行形成的列有没有重复的,有的话重新随机上一行,以及3*3格子里有没有一样的。

package dome;    //数独9x9public class num_only {    public static void main(String[] args) {        boolean Sw=true;        while(Sw) {            int[][] number=new int[9][9];            for(int i=0;i<number.length;i++) {                  for(int j=0;j<number.length;j++) {                          number[i][j]=(int)(Math.random()*9+1);                    for(int j_=j-1;j_>=0;j_--) {            //判断行                        if(number[i][j]==number[i][j_]) {                            j--;                            break;                        }                    }                   }                for(int jj=0;jj<number.length;jj++) {       //判断列                    for(int i_=i-1;i_>=0;i_--) {                        if(number[i][jj]==number[i_][jj]) {                            i--;                            break;                        }                    }                               }                               //i=036 随便,i=147不能等于上一行,i=259不能等于上两行  3x3                if(i%3==1) {                    for(int jj=0;jj<number.length;jj=jj+3) {                        int[][] i2=threethree(number,(i-1),jj,2,3);                        //判断i2数组中是否有一样的                                         if(DifferenceArrays(i2)==false) {                            i--;                            break;                        }                                           }                   }else if(i%3==2) {                    for(int jj=0;jj<number.length;jj=jj+3) {                        int[][] i2=threethree(number,(i-2),jj,3,3);                        if(DifferenceArrays(i2)==false) {                            i--;                            break;                        }                       }                               }            }            //花哨的打印出来_(:з」∠)_            System.out.println("—————————————————————————————————————");                        for(int i=0;i<number.length;i++) {                for(int j=0;j<number.length;j++) {                    if(j==0) {                        System.out.print("| ");                    }                    System.out.print(number[i][j]+" | ");                }                System.out.println();                System.out.println("—————————————————————————————————————");            }            //System.out.println(Arrays.toString(number));            Sw=false;        }    }    //复制二维数组    public static int[][] threethree(int[][] a,int i,int j,int i_,int j_) {        int[][] b=new int[i_][j_];        int temp=j;        for(int ii=0;ii<i_;ii++) {            j=temp;            for(int jj=0;jj<j_;jj++) {                b[ii][jj]=a[i][j];                j++;            }            i++;        }        return b;    }       //判断一个二维数组里有没有重复的数字  有false  没有true    public static boolean DifferenceArrays(int[][] a) {        boolean b=true;        outer:for(int i=0;i<a.length;i++) {            for(int j=0;j<a[i].length;j++) {                for(int ii=0;ii<a.length;ii++) {                    for(int jj=0;jj<a[i].length;jj++) {                        if(ii==i&&jj==j) {                            continue;                        }                        if(a[i][j]==a[ii][jj]) {                            b=false ;                            break outer;                        }                    }                }            }        }        return b;    }}

测试结果:
测试结果
查了下资料发现数独挖坑还是很有讲究的,随便挖空的话解还不一定是唯一的。闲了再认真想想好了=_=