第1章 游戏之乐——构造数独

 构造数独

1. 问题

  构造一个9*9的方格矩阵,玩家要在每个方格中,分别填上1至9的任意一个数字,让整个棋盘每一列、每一行以及每一个3*3的小矩阵中的数字都不重复。

2. 求解

  用转置的方法生成数独数组,代码如下:

  1 package chapter1youxizhileShuDu;
  2 
  3 import java.util.Random;
  4 
  5 /**
  6  * 用置换法生成数独矩阵
  7  * @author DELL
  8  *
  9  */
 10 public class ShuDu {
 11     private int a[]; //存放随机生成的1-9的数组
 12     public ShuDu(){
 13         a = new int[9];
 14         randomArr();
 15         juzhen();
 16     }
 17     /**
 18      * 随机生成1-9的数组
 19      */
 20     public void randomArr(){
 21         Random r = new Random();
 22         int x = 1+r.nextInt(9);
 23         a[0]=x;
 24         for(int i=1;i<9;i++){
 25             x = 1+r.nextInt(9);
 26             for(int j=0;j<a.length;j++){
 27                 if(a[j]==x){
 28                     x = 1+r.nextInt(9);
 29                     j=-1;
 30                 }
 31             }
 32             a[i] = x;
 33         }
 34     }
 35     //通过转置为矩阵赋值
 36     public void juzhen(){
 37         int b[][];  //存放矩阵的数组
 38         b = new int[9][9];
 39         int i,j;
 40         //为中间的3x3矩阵赋值
 41         for(i=0;i<3;i++){
 42             for(j=0;j<3;j++){
 43                 b[i+3][j+3]=a[i*3+j];
 44             }
 45         }
 46         //为中间左边的3x3矩阵赋值
 47         for(i=0;i<3;i++){
 48             b[3][i] = b[5][3+i];
 49             b[4][i] = b[3][3+i];
 50             b[5][i] = b[4][3+i];
 51         }
 52         //为中间右边的3x3矩阵赋值
 53         for(i=0;i<3;i++){
 54             b[3][i+6]=b[4][3+i];
 55             b[4][i+6]=b[5][3+i];
 56             b[5][i+6]=b[3][3+i];
 57         }
 58         //为中间上边的3x3矩阵赋值
 59         for(i=0;i<3;i++){
 60             b[i][3]=b[i+3][5];
 61             b[i][4]=b[i+3][3];
 62             b[i][5]=b[i+3][4];
 63         }
 64         //为中间下边的3x3矩阵赋值
 65         for(i=0;i<3;i++){
 66             b[i+6][3]=b[i+3][4];
 67             b[i+6][4]=b[i+3][5];
 68             b[i+6][5]=b[i+3][3];
 69         }
 70         //为左上角的3x3矩阵赋值
 71         for(i=0;i<3;i++){
 72             b[0][i]=b[2][i+3];
 73             b[1][i]=b[0][i+3];
 74             b[2][i]=b[1][i+3];
 75         }
 76         //为右上角的3x3矩阵赋值
 77         for(i=0;i<3;i++){
 78             b[0][i+6]=b[1][i+3];
 79             b[1][i+6]=b[2][i+3];
 80             b[2][i+6]=b[0][i+3];
 81         }
 82         //为左下角的3x3矩阵赋值
 83         for(i=0;i<3;i++){
 84             b[6][i]=b[8][i+3];
 85             b[7][i]=b[6][i+3];
 86             b[8][i]=b[7][i+3];
 87         }
 88         //为右下角的3x3矩阵赋值
 89         for(i=0;i<3;i++){
 90             b[6][i+6]=b[7][i+3];
 91             b[7][i+6]=b[8][i+3];
 92             b[8][i+6]=b[6][i+3];
 93         }
 94         System.out.println("随机生成的数独矩阵为:");
 95         for(i=0;i<9;i++){
 96             for(j=0;j<9;j++){
 97                 System.out.print(b[i][j]+" ");
 98             }
 99             System.out.println();
100         }
101     }
102     
103     public static void main(String[] args) {
104         new ShuDu();
105 
106     }
107 
108 }

程序运行结果如下:

随机生成的数独矩阵为:
4 5 7 6 2 3 9 1 8 
6 2 3 9 1 8 4 5 7 
9 1 8 4 5 7 6 2 3 
5 7 4 2 3 6 1 8 9 
2 3 6 1 8 9 5 7 4 
1 8 9 5 7 4 2 3 6 
7 4 5 3 6 2 8 9 1 
3 6 2 8 9 1 7 4 5 
8 9 1 7 4 5 3 6 2 

参考链接:

编程之美1.15——构造数独

编程之美--构造数独

编程之美-构造数独(1)

编程之美1.15节:构造数独算法-回溯法和置换法

编程之美...构造数独

编程之美-构造数独

原文地址:https://www.cnblogs.com/gaopeng527/p/4611497.html