数独解法分析

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1.数独游戏的介绍
拉丁方块的规则:每一行(Row)、每 一列(Column)均含1-N(N即盘面的 规格),不重复。这与前面提到的标 准数独非常相似,但少了一个宫的规 则。
1.数独游戏的介绍
玩家需要根据9×9盘面上的已知数 字,推理出所有剩余空格的数字, 并满足每一行、每一列、每一个粗 线宫内的数字均含1-9,不重复
数独解法分析
1.数独游戏的介绍 2.问题分析 3.实例测试 4.其他方法 5.相关推荐
1.数独游戏的介绍
既然“数独”有一个字是“数”,人们 也往往会联想到数学,那就不妨从大家 都知道的数学家欧拉说起,但凡想了解 数独历史的玩家在网络、书籍中搜索Baidu Nhomakorabea, 共同会提到的就是欧拉的“拉丁方块 (Latin square)”
5.相关推荐
5.相关推荐
5.相关推荐
可以自己上网找源码,研究分析别人的算法 自己的算法也会不知不觉的越来越好。
1.随机产生一个随机数
2.问题分析
基本思路:
先在第一行生成一组1-9 不重复的数字
从第二行开始填写从1到9 的数字不停的回退,然后 再不停的验证。
缺点: 效率慢!!!!!!!!!
1.随机产生一个随机数
2.问题分析 优化1: 循环遍历 9 X 9 的数独格子,在遍历到的当前 格子的候选数字中随机选取一个数字填入, 如果当前格子没有了候选数字则清空所有已 经填好的格子,重新再来。这是一个最简单 的也是最容易理解的概率方法了。
核心算法:回溯法 用DFS()深度优先搜索
2.求解随机数独
2.问题分析
如果这个数字不符合规 则则回到上一个小格内 else{ ShuDu[i][j]=0; row[i][k]=0; col[j][k]=0; sql[(i+2)/3][(j+2)/3][k]=0; // 宫内格子间的间隔 } } if(k==9) return 0; //都设置完,结束 } } } } return 1; } 2.求解随机数独
2.求解随机数独
{
2.问题分析
0
1
0
1
0
0
1
0
0
1
0
1
row
2
3
4
5
6
7
8
9
这一行中已经有 1,3,6,9,四个数了
对于ShuDu数组从1行1列开 始,一个一个的检查,若 第ShuDu[I][J]不为零,则令 k= ShuDu[I][J],令 row[i][k]=1,col[j][k]=1
2.求解随机数独
2.问题分析
static int DFS(){ //静态成员方法 for(int i=1;i<=9;i++){ for(int j=1;j<=9;j++){ if(ShuDu[i][j]==0){ for(int k=1;k<=9;k++){ if( row[i][k]==0 && col[j][k]==0 && sql[(i+2)/3][(j+2)/3][k]==0 ){ ShuDu[i][j]=k; row[i][k]=1; col[j][k]=1; sql[(i+2)/3][(j+2)/3][k]=1; if( DFS()==1 ) return 1;
1.数独游戏的介绍
1.数独游戏的介绍
独盘面是个九宫,每一宫又 分为九个小格。在这八十一 格中给出一定的已知数字和 解题条件,利用逻辑和推理, 在其他的空格上填入1-9的数 字。
1.数独游戏的介绍
使1-9每个数字在每一行、每一列和每 一宫中都只出现一次,所以又称“九 宫格”。
1.数独游戏的介绍
1.数独游戏的介绍 2.问题分析 3.实例测试 4.其他方法 5.相关推荐
3.实例测试
3.实例测试
1.数独游戏的介绍 2.问题分析 3.实例测试 4.其他方法 5.相关推荐
4.其他方法
1.数独游戏的介绍 2.问题分析 3.实例测试 4.其他方法 5.相关推荐
5.相关推荐
Hodoku 有着非常强大的数独解题过程 完全是按照正规的人类解题的思路去解的 解题速度就快
1.数独游戏的介绍
Killer数独 在标准数独规则的基础上, 每个虚线框左上角的数字 表示虚线框内所有数字之 和,每个虚线框内数字无 重复。
1.数独游戏的介绍 2.问题分析 3.实例测试 4.其他方法 5.相关推荐
2.问题分析
1.随机数组的产生
2.求解随机数独
3.代码优化
2.问题分析
这是重点也是一个难点,网上也有 各种大神晒自己的代码,有的代码 效率高,有的代码易于理解
使1-9每个数字在每一行、每一列和每 一宫中都只出现一次,所以又称“九 宫格”。
1.数独游戏的介绍
对角线数独: 在标准数独规则 基础上,两条大 对角线的数字不 重复。
1.数独游戏的介绍
锯齿数独: 相对标准数独而言,宫变成了不规则的。玩家需在 对应的锯齿方框内填入不重复的九个数,并保证横 纵也不重复。
2.求解随机数独
2.问题分析
判断行是否 重复
三个记录数组: public static int[][] row=new int[10][10]; public static int[][] col=new int[10][10]; public static int[][][] sql=new int[4][4][10];
2.问题分析 代码优化
对于空白格从1开始到 9循环,的确增加了相 当多的时间,可以对 于每个空白格算出它 的候选值
把候选数字都按大小 从小到大排序,用一 个栈记录已经选取过 的候选数字在这个序 列中的序号。
3.代码优化
2.问题分析
每一次选取候选数字 就入栈,每一次回溯 就出栈。
更新候选 数字
3.代码优化
1.随机产生一个随机数
2.问题分析
优化2:
先写一个数独出来, 用二维数组A表示
然后再生成一个乱序的19一维数组,用一维数组b 表示。
遍历这个A数组,在b中找 到A数组中当前值所在的位 置,然后将b数组中下一个 位置的数字赋给A的当前值,
1.随机产生一个随机数
2.问题分析
设一个10*10的数组来存放数独数 据(第0行,第0列均设为0) ShuDu[10][10]
判断列是否 重复
判断宫格内 是否重复
2.求解随机数独
2.问题分析
将三个数组初始化为0; static void setzero();
判断要求解的数独数组中行列和宫 static void setzero2()
2.求解随机数独
2.问题分析
static void setzero(){ for(int i=1;i<=9;i++){ for(int j=1;j<=9;j++){ If(ShuDu[i][j]!=0) { int k=ShuDu[i][j]; row[i][k]=1; col[j][k]=1; sql[(i+2)/3][(j+2)/3][k]=1; } } }
相关文档
最新文档