您的位置:首页 > 其它

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

2015-06-30 23:30 281 查看

构造数独

1. 问题

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

2. 求解

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

package chapter1youxizhileShuDu;

import java.util.Random;

/**
* 用置换法生成数独矩阵
* @author DELL
*
*/
public class ShuDu {
private int a[]; //存放随机生成的1-9的数组
public ShuDu(){
a = new int[9];
randomArr();
juzhen();
}
/**
* 随机生成1-9的数组
*/
public void randomArr(){
Random r = new Random();
int x = 1+r.nextInt(9);
a[0]=x;
for(int i=1;i<9;i++){
x = 1+r.nextInt(9);
for(int j=0;j<a.length;j++){
if(a[j]==x){
x = 1+r.nextInt(9);
j=-1;
}
}
a[i] = x;
}
}
//通过转置为矩阵赋值
public void juzhen(){
int b[][];  //存放矩阵的数组
b = new int[9][9];
int i,j;
//为中间的3x3矩阵赋值
for(i=0;i<3;i++){
for(j=0;j<3;j++){
b[i+3][j+3]=a[i*3+j];
}
}
//为中间左边的3x3矩阵赋值
for(i=0;i<3;i++){
b[3][i] = b[5][3+i];
b[4][i] = b[3][3+i];
b[5][i] = b[4][3+i];
}
//为中间右边的3x3矩阵赋值
for(i=0;i<3;i++){
b[3][i+6]=b[4][3+i];
b[4][i+6]=b[5][3+i];
b[5][i+6]=b[3][3+i];
}
//为中间上边的3x3矩阵赋值
for(i=0;i<3;i++){
b[i][3]=b[i+3][5];
b[i][4]=b[i+3][3];
b[i][5]=b[i+3][4];
}
//为中间下边的3x3矩阵赋值
for(i=0;i<3;i++){
b[i+6][3]=b[i+3][4];
b[i+6][4]=b[i+3][5];
b[i+6][5]=b[i+3][3];
}
//为左上角的3x3矩阵赋值
for(i=0;i<3;i++){
b[0][i]=b[2][i+3];
b[1][i]=b[0][i+3];
b[2][i]=b[1][i+3];
}
//为右上角的3x3矩阵赋值
for(i=0;i<3;i++){
b[0][i+6]=b[1][i+3];
b[1][i+6]=b[2][i+3];
b[2][i+6]=b[0][i+3];
}
//为左下角的3x3矩阵赋值
for(i=0;i<3;i++){
b[6][i]=b[8][i+3];
b[7][i]=b[6][i+3];
b[8][i]=b[7][i+3];
}
//为右下角的3x3矩阵赋值
for(i=0;i<3;i++){
b[6][i+6]=b[7][i+3];
b[7][i+6]=b[8][i+3];
b[8][i+6]=b[6][i+3];
}
System.out.println("随机生成的数独矩阵为:");
for(i=0;i<9;i++){
for(j=0;j<9;j++){
System.out.print(b[i][j]+" ");
}
System.out.println();
}
}

public static void main(String[] args) {
new ShuDu();

}

}


程序运行结果如下:

随机生成的数独矩阵为:
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节:构造数独算法-回溯法和置换法

编程之美...构造数独

编程之美-构造数独

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: