• 数独游戏_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写的,但是最重要的还是思想.

  • 相关阅读:
    Java多态(更新中...)
    C语言free释放内存后为什么指针里的值不变?竟然还可以输出?
    LeetCode:344-反转字符串
    20150518 字符设备驱动
    20150517 Linux文件系统与设备文件系统
    20150514我读《深入理解linux内核》之虚拟文件系统笔记
    双系统Ubuntu下修复启动项的两种方法
    20150503 imx257下实现I2C驱动的四种方法
    20150502 调试分析之 使用gdb远程调试ARM开发板
    20150501 调试分析之 修改内核来定位系统僵死问题
  • 原文地址:https://www.cnblogs.com/woodywu/p/1641533.html
Copyright © 2020-2023  润新知