zoukankan      html  css  js  c++  java
  • 第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节:构造数独算法-回溯法和置换法

    编程之美...构造数独

    编程之美-构造数独

  • 相关阅读:
    归并排序
    数据组合求值
    轨道周期
    类及对象构建
    日期改写
    排列组合去重
    库存更新
    Java性能测试从入门到放弃-详解篇
    Java性能测试从入门到放弃-概述篇
    cocos2d-x安装教程
  • 原文地址:https://www.cnblogs.com/gaopeng527/p/4611497.html
Copyright © 2011-2022 走看看