第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节:构造数独算法-回溯法和置换法
编程之美...构造数独
编程之美-构造数独
相关文章推荐
- Android 百分比布局库(percent-support-lib) 以后大家适配会更容易
- GeoServer
- SVN commit,update用法
- Codeforces Round #311 (Div. 2)A Ilya and Diplomas
- 【面试总结】--记录一次面试经历
- 对于多表联合查询的一点理解
- c++中输出十进制,十六进制,八进制。默认输出十进制的数据和左右对齐
- iOS Portrait Landscape retina 4
- 14.04麒麟为/检查磁盘时发生严重错误的解决方法
- android sqlite的orm框架
- 和View Controllers一起工作
- mondb入手
- 二分算法
- 云计算名词解析
- Storm
- jaxp解析XML之DOM解析
- 关于签名
- 云计算的由来——开发过程和交付方式
- uva806 Spatial Structures 空间结构 (黑白图像的四分树表示)
- 百万级PHP网站架构工具箱