数独游戏_Core代码段

   自己写来玩的,觉得记下来还是有点意义的,呵呵:

SudukuGame
  1 //--------------------------------//
  2 //作者:不喝橙汁
  3 //完成日期:09.12.30
  4 //--------------------------------//
  5 
  6 public class Suduku_Core
  7 {
  8     private int[] hole=new int[81];
  9     private int[][] test=new int[9][9];
 10     private int nHole,N,num,X,Y,FillNum,Cnum;
 11     
 12     //Generator方法
 13     //产生原始填充数独
 14     private void Generator()      
 15     {
 16         Cnum=0;N=9;nHole=0;    
 17         int count=0;
 18         num=10+(int)(Math.random()*6);  //产生10到16之间的随机数,不包括16,也就是10到15的整数
 19         
 20         //while循环
 21         //尝试在数组中填入符合数独规则的数字
 22         //以此来减少树的分支,提高效率
 23         
 24         while(count!=num)
 25         {
 26             X=(int)(Math.random()*9);
 27             Y=(int)(Math.random()*9);
 28             FillNum=1+(int)(Math.random()*9);
 29             if(bPack(X,Y,FillNum))
 30             {
 31                 test[X][Y]=FillNum;
 32                 count++;
 33             }
 34         }
 35     }
 36     
 37     //bPack方法
 38     //判断是否可将 n 填入 M[y][x] 里
 39     private boolean bPack (int x, int y, int n)            
 40     {
 41         //for循环
 42         //纵横判断
 43         for (int i=0; i<N; i++)                 //若 M[0~N-1][x]
 44             if (n == test[x][i] || n == test[i][y])   //或 M[y][0~N-1] 中已存在 n
 45                 return false;                   //则返回 false
 46     
 47         //for循环
 48         //区域判断
 49         int D_X,D_Y,OrderNum;
 50         OrderNum=9*(x+1)+(y+1);
 51         D_X=((int)(x/3))*3;
 52         D_Y=((int)(y/3))*3;
 53         for(int count=0;count != 9;count++)
 54         {
 55             if(D_X==&& D_Y==y)
 56                 continue;
 57             if(test[(D_X+count/3)][(D_Y+count%3)]==n)
 58                 return false;
 59         }
 60         
 61         //返回结果
 62         return true;
 63     }
 64 
 65     //fill方法
 66     //此方法用来填充完整已有数子的数独    
 67     private void fill(int num)   
 68     {
 69         if(Cnum==81)
 70         {
 71             print();
 72             return;  //表示填满返回
 73         }
 74         if(test[Cnum/9][Cnum%9]!=0)
 75         {
 76             ++Cnum;
 77             fill(Cnum);    //位置不为0,填充下一个
 78             return;
 79         }
 80         else
 81         {
 82             //从1到9里面选择数字填进去
 83             for(int x=1;x!=11;x++)    //x=10 是哨兵
 84             {
 85                 if(Cnum==81)
 86                 {
 87                     return;  //表示填满返回
 88                 }
 89                 if(x==10 && Cnum!=0)
 90                 {
 91                     --Cnum;
 92                     test[(Cnum/9)][(Cnum%9)]=0;
 93                     return;   
 94                 }
 95 
 96                 if(bPack((Cnum/9),(Cnum%9),x))
 97                 {
 98                     test[(Cnum/9)][(Cnum%9)]=x;
 99                     ++Cnum;
100                     fill(Cnum);
101                 }
102             }
103         }
104 
105     }
106     
107     //print方法
108     //打印数组到屏幕
109     private void print()
110     {
111         for(int m=0;m<9;m++)
112         {
113             System.out.println();
114             for(int n=0;n<9;n++)
115             {
116                 System.out.print(test[m][n]);
117             }
118         }
119     }
120     
121     //getArry方法
122     //获取生成的数组
123     public int[][] getArry()
124     {
125         Generator();
126         //print();    //此时打印的是原始的数独数组
127         fill(Cnum);
128         //print();    //此时打印的是填充完整的数独
129         //cout<<endl<<"OVER";
130         System.out.println();
131         System.out.println("OVER");    //打印完毕
132         return test;
133     }
134     
135     public static void main(String args[])
136     {
137         Suduku_Core test=new Suduku_Core();
138         test.getArry();
139     }
140 };
141 
142 

虽然是用java写的,但是最重要的还是思想.

原文地址:https://www.cnblogs.com/woodywu/p/1641533.html