数独,是源自18世纪瑞士的一种数学游戏。是一种运用纸、笔进行演算的逻辑游戏。玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个粗线宫内的数字均含1-9,不重复。
数独盘面是个九宫,每一宫又分为九个小格。在这八十一格中给出一定的已知数字和解题条件,利用逻辑和推理,在其他的空格上填入1-9的数字。使1-9每个数字在每一行、每一列和每一宫中都只出现一次,所以又称“九宫格”。
  这篇博客的内容主要分为三个部分。第一部分是随机生成一个符合数独规则的九宫格,在这个九宫格中,每一行、每一列以及每一宫都不会出现重复的1-9数字。第二部分,通过第一部分生成的九宫格,对其中的81个数字随机选取46位(81-35=46)置零,以此形成数独游戏。第三部分,是针对第二部分生成的数独游戏,使用回溯法,实现对数独的解答。
代码如下:
package jiuGong;import java.util.ArrayList;
import java.util.Random;public class GenerateJiuGongGe {//第一部分代码,通过回溯法随机生成符合九宫格规则的九宫格//用回溯法随机生成九宫格(此处只生成一个九宫格),// bl用来作为标记,当随机生成第一个九宫格时,将bl置为true,然后结束回溯。//jiuGongGe作为临时储存随机生成的九宫格,当回溯法结束时,jiuGongGe将会变为初始状态;// end_jiuGongGe用来储存最终随机生成的九宫格private static int jiuGongGe[][] = new int[9][9];private static Boolean bl = false;private static int end_jiuGongGe[][] = new int[9][9];/*** 判断在九宫格中的坐标(x,y)的位置上插入value,是否符合规则** @param x* @param y* @param value* @return*/public static Boolean legal(int a[][],int x, int y, int value) {for (int i = 0; i < 9; i++) {//如果列中有value,则返回falseif (i != x && a[i][y] == value) {return false;}//如果行中有value,则返回falseif (i != y && a[x][i] == value) {return false;}}//(minX,minY)是(x,y)所属小九宫格的左上角的坐标int minX = x / 3 * 3;int minY = y / 3 * 3;for (int i = minX; i < minX + 3; i++) {for (int j = minY; j < minY + 3; j++) {//如果小九宫格中的非(x,y)的坐标上的值为value,返回falseif (i != x && j != y && a[i][j] == value) {return false;}}}return true;}/*** 随机生成九宫格的算法,通过回溯生成。** @param k*/public static void generateJiugongGe(int k) {if (bl) {return;}if (k == 81) {for (int i = 0; i < 9; i++) {for (int j = 0; j < 9; j++) {System.out.print(jiuGongGe[i][j] + " ");end_jiuGongGe[i][j] = jiuGongGe[i][j];}System.out.println();}bl = true;return;}//取得第k+1个值所对应的坐标(x,y),k是从0开始的。int x = k / 9;int y = k % 9;if (jiuGongGe[x][y] == 0) {//index用来判断是否已经完全随机生成了1-9这个9个数int index = 0;while (index < 9) {//动态数组list用来储存已经随机生成的1-9的数字ArrayList list = new ArrayList(9);Random random = new Random();int i = random.nextInt(9) + 1;//当list中包含数字i时,在重新生成1-9的数字while (list.contains(i))i = random.nextInt(9) + 1;list.add(i);index++;jiuGongGe[x][y] = i;//legal()函数是判断在九宫格中的坐标(x,y)的位置上插入i,是否符合规则if (legal(jiuGongGe,x, y, i)) {generateJiugongGe(k + 1);}}jiuGongGe[x][y] = 0;     //回溯时,将坐标(x,y)的值置零} else {generateJiugongGe(k + 1);}}/*** 第二部分,通过第一部分生成的九宫格,对其中的81个数字随机选取46位(81-35=46)置零,以此形成数独游戏。* @param ArryJiuGongGe* @return*/public static int[][] generateShuDu(int ArryJiuGongGe[][]){Random random=new Random();ArrayList list=new ArrayList(35);for (int i = 0; i <35 ; i++) {int index=random.nextInt(81);while (list.contains(index)){index=random.nextInt(81);}list.add(index);}int shuDu[][]=new int[9][9];for (int i = 0; i <9 ; i++) {for (int j = 0; j <9 ; j++) {if(!list.contains(i*9+j)){shuDu[i][j]=0;}else{shuDu[i][j]=ArryJiuGongGe[i][j];}}}return shuDu;}//第三部分,是针对第二部分生成的数独游戏,使用回溯法,实现对数独的解答。//shuDu[][]是用来存放数独游戏的二维数组。//numOfSolution是用来统计shuDu[][]中存放的数独游戏的解的个数public static int shuDu[][] = new int[9][9];public static int numOfSolution=1;/**** @param shuDu*/public static void setShuDu(int[][] shuDu) {GenerateJiuGongGe.shuDu = shuDu;}/*** 回溯法求解数独,参考第一部分用回溯法随机生成数独的解空间的代码* @param k*/public static void shuDu_solution(int k) {if (k == 81) {System.out.println("解法"+numOfSolution);for (int i = 0; i < 9; i++) {for (int j = 0; j < 9; j++) {System.out.print(shuDu[i][j] + " ");}System.out.println();}numOfSolution++;return;}int x = k / 9;int y = k % 9;if (shuDu[x][y] == 0) {for (int i = 1; i <= 9; i++) {shuDu[x][y] = i;if (legal(shuDu,x, y, i)) {shuDu_solution(k + 1);}}shuDu[x][y] = 0;} else {shuDu_solution(k + 1);}}//打印二维数组a[m][n]public static void displayArray(int a[][], int m, int n) {for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {System.out.print(a[i][j] + " ");}System.out.println();}}public static void main(String[] args) {//第一部分的测试生成一个符合数独规则的九宫格System.out.println("第一部分的测试生成一个符合数独规则的九宫格");generateJiugongGe(0);System.out.println();displayArray(end_jiuGongGe,9,9);System.out.println();//第二部分的测试,生成一个数独游戏,并输出该游戏System.out.println("第二部分的测试,生成一个数独游戏,并输出该游戏");System.out.println("----------------------------");System.out.println("生成数独");int generateShuDu[][]=generateShuDu(end_jiuGongGe);setShuDu(generateShuDu);displayArray(shuDu, 9, 9);System.out.println();//第三部分的测试,对数独游戏的解,并输出所有的解System.out.println("第三部分的测试,对数独游戏的解,并输出所有的解");System.out.println("----------------------------");System.out.println("shudu_solution");shuDu_solution(0);}}

从随机生成九宫格至随机生成数独游戏再至用回溯法实现数独的解相关推荐

  1. python数独伪代码回溯法_数独的暴力回溯解法和Python GUI

    数独起源于18世纪初瑞士数学家欧拉等人研究的拉丁方阵,20世纪70年代,经过美国及日本学者的推广和改良,定名为数独(Sudoku),大致的意思是"独个的数字"或"只出现一 ...

  2. 回溯法求解数独问题(最简单,通俗易懂,附C++代码)

    问题描述:数独是一种运用纸.笔进行演算的逻辑游戏.玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行.每一列.每一个九宫格内的数字均含1-9,不重复 要求:设计算法随机生成不同 ...

  3. python可以数独游戏吗_如何用Python创建数独游戏

    你可以生成一个随机数独解决方案板,在那里所有的数字都被填写,然后删除其中一些,以创建拼图.这将确保谜题始终有一个解决方案.确保它只有一个解决方案会更具挑战性(提示:一个9x9数独游戏必须至少留下17个 ...

  4. 数独游戏python制作_使用Python编写数独游戏自动出题程序

    数独是一个很好玩的游戏,可以锻炼推理能力.下面的代码可以自动生成数独游戏题目. from random import shuffle, randrange def generate(): # 初始网格 ...

  5. 数独游戏-蓝桥杯-C语言,数独游戏_java_深搜+回溯

    问题描述 你一定听说过"数独"游戏. 如[图1.png],玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行.每一列.每一个同色九宫内的数字均含1-9,不重 ...

  6. python数独伪代码回溯法_数独 #回溯算法 #CTF

    1. intro:巅峰极客的一道逆向 刷巅峰极客2020里的rev题fu!kpy,复杂得不行但是看到if d[1][0] != '8' or d[1][7] != '2'和if check(h1) ! ...

  7. 用代码证明自己闲的蛋疼(三)——回溯法做数独

    数独大家应该都玩过,1~9数字,满足每一行.每一列.每一个粗线宫(3*3)内的数字均含1-9,不重复. 起始会有一些给定的值,然后我们去填剩余的数,一个合理的数独最终解一定是唯一的. 九日哥也很喜欢玩 ...

  8. 递归回溯法求数独全部解

    项目介绍 QT5做的数独求解程序,可以判断数独解的个数(如果非唯一解). 运行截图 源码说明 使用MSVC + QT5平台,故* .cpp和* .h文件均采用UTF8 + BOM编码.如果切换到Min ...

  9. 基于C语言的9*9数独生成器(回溯法)

    基于C语言的9*9数独生成器 题目要求如下图所示: 我们采用的思路是首先生成一个完整的9*9数独,然后再随机挖空,这样就形成了一个数独局面. 代码如下: #include <stdio.h> ...

  10. 【算法分析】回溯法解数独(九宫格)算法

    这篇文章,是来详细介绍怎样写出一个算法,来解出所有的数独问题.算法的程序运行时间,缩减在了毫秒级别.等到这篇文章结束,我会抽时间写一篇文章,介绍如何生成一个随机的唯一解的数独问题.另外,为了做图形方便 ...

最新文章

  1. Linux中的动态库和静态库(.a/.la/.so/.o)
  2. delphi中的函数传参如何传枚举参数_shell脚本的函数介绍使用和工作常用案例。建议收藏...
  3. Java 基本功之(三)Java 核心技术
  4. mysql错误:……is marked as crashed and should be repai
  5. 03_Android项目中读写文本文件的代码
  6. 3/100. Merge Two Binary Trees
  7. 详解Spring中的CharacterEncodingFilter--forceEncoding为true在java代码中设置失效--html设置编码无效...
  8. vagrant:修改Linux网络设置
  9. 2017 多校4 Wavel Sequence
  10. Effectively Learning Spatial Indices(VLDB)
  11. Qiyuan-接小球游戏3.0
  12. Word中录制宏,学会后成大神
  13. StreamX(1):StreamX概述
  14. curl https -k
  15. 【原创】Quartus II 简单设计流程
  16. 百合数c语言360问答,百合数量的含义?
  17. Java对接JeePay支付、转账实现以及回调函数
  18. ArcMap 基于DEM的基础地形分析
  19. python之元编程
  20. [CVPR2020]Learning to Cartoonize Using White-box Cartoon Representations

热门文章

  1. 当代网瘾少年分析,以“2020年,我打了多少局王者荣耀”为例
  2. 计算机文献信息检索发展的最高阶段,文献检索作业答案.doc
  3. 魔戒三曲,黑暗散去;人皇加冕,光明归来
  4. 【100+ python基础入门-26】python修改列表元素方法
  5. 【Leetcode】347. 前 K 个高频元素
  6. 微信电子驾驶证怎么查询
  7. 【计算广告】边际成本的妙用
  8. Photographic Tone Reproduction for Digital Images
  9. 《听闻远方有你》简谱-刘均演唱
  10. Linux的LILO引导程序,LILO引导装载器详解