下面是经典数独游戏戏,求解

 上传我的文档
 上传文档
 下载
 收藏
粉丝量:592
这是一个分类齐全的医学资料库:包括内科;外科;其他临床学科;中医科;基础医学;及辅助科室(影像学、医学检验科)等等。当然本人的网站不但有丰富的医学资料,还有其他很多高质量的资料,欢迎大家下载。
 下载此文档
数独游戏的求解算法的研究
下载积分:1000
内容提示:数独游戏的求解算法的研究
文档格式:PDF|
浏览次数:25|
上传日期: 14:55:14|
文档星级:
全文阅读已结束,如果下载本文需要使用
 1000 积分
下载此文档
该用户还上传了这些文档
数独游戏的求解算法的研究
关注微信公众号数独游戏必须是唯一解吗_百度知道
数独游戏必须是唯一解吗
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
不是,很多数独有多解,至少要有17 个已知数字才可能有唯一解。有两个数字都没出现,必定不唯一解(因为这俩数可以互换);一个3×3块区都没有数字,必定多解;还有其他情况。
采纳率:76%
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。游戏蛮牛学习群(纯技术交流,不闲聊):
扫一扫,访问微社区
后使用快捷导航没有帐号?
签到成功!您今天第{todayrank}个签到,签到排名竞争激烈,记得每天都来签到哦!已连续签到:{constant}天,累计签到:{days}天
数独游戏题目 使用回溯法求解数独问题,数独游戏算法
阅读&534 |
数独游戏题目Title :
算法,数独用概率算法中的拉斯维加斯算法实现数独问题的生成用回溯法实现对数独问题的求解
注:数独问题与数度难题的区别是数度难题只有一个解,而数独问题的解有一个或多个。
Introduction :
标准的数独游戏是在一个 9 X 9 的棋盘上填写 1 – 9 这 9 个数字,规则是这样的:
棋盘分成上图所示的 9 个区域(不同颜色做背景标出,每个区域是 3 X 3 的子棋盘),在每个子棋盘中填充 1 – 9 且不允许重复 ,下面简称块重复每一行不许有重复值 ,下面简称行重复每一列不许有重复值 ,下面简称列重复
如上红色框出的子区域中的亮黄色格子只能填 8。
扩展阅读:
随机生成数独问题,如果做成一个数独小游戏的话可以按游戏难易程度生成,比如有简单、中等、困难三个程度求解数独问题,根据生成的数独问题或者用户输入的数独问题求解出所有答案或者求解出不超过MAX个答案,因为某个问题可能含有上十万个解,用MAX约束找到MAX个答案后就不再找其它的答案
有一种求解数独问题的方案是“候选数字法”,就是在待填充的格子中填写不会造成行重复、列重复、块重复的数字,有的时候存在多个这样的数字,那么我们可以随机选取一个,如果待填充的格子中填写任何一个数字都会造成某种重复的发生,则说明这个问题没有解,也就是这不是一个数独问题。如上图中红色框出区域的下面一个区域的红色格子中可以填写的数字为 4、8、9,那么它的候选数字就是4、8、9,你可以随机选一个填入。当所有的格子填充完后数独问题就解决了。
根据上述的这种候选数字法,我们可以用它来生成数独问题以及求解数独问题。
关于生成数独问题:
循环遍历 9 X 9 的数独格子,在遍历到的当前格子的候选数字中随机选取一个数字填入,如果当前格子没有了候选数字则清空所有已经填好的格子,重新再来。这是一个最简单的也是最容易理解的概率方法了。伪码如下:
1: int[][] sudoku = new int[9][9]; //数独棋盘
2: while(true) {
clearSudoku(); //清空所有已填数字, 每个格子置 0
for(int row = 0; row & 9; row++) {
for(int col = 0; col & 9; col++) {
//getCandidates(row, col) 获取当前格子的候选数字
//randomCandidate() 随机选取一个候选数字
if(getCandidates(row, col) != NULL) //如果有候选数字
sudoku[row][col] = randomCandidate(getCandidates(row, col));
//跳转到label那里清空格子重新来过
关于求解数独问题:
同上, 不过这次不是采用随机算法,因为随机算法没法保证把所有的解都求出。利用回溯法把所有可能的情况都遍历,那么就可以求出所有的解。我们考虑下面的一个实例:
初始时,sudoku[0][0]格子的候选数字为2, 3,5, 6,如图标出,sudoku[4][0]的为2,4,5,其它如图。那么我们在填充sudoku[0][0]的时候不能按照随机来了,因为我们需要把所有的情况遍历的话,需要按一定顺序来,也就是从2开始来,因为一旦某个格子填充了一个候选数字后,其它格子的候选数字会发生变化,假设sudoku[0][0]填充了2,那么与sudoku[0][0]在同一行、同一列、同一块内的格子的候选数字就不能再有2了,sudoku[4][0]、sudoku[6][0]等都应该将原来含有的2给删掉。
我们遍历着填写候选数字,当遇到某个格子的候选数字不存在的时候,我们应该回溯了,我们回到上一格,填写另一个候选数字。比如上图,我们按照这样的顺序来:
sudoku[0][0]填写2,sudoku[4][0]候选为(4,5),sudoku[6][0]候选为(3, 5),sudoku[7][0]候选为(4, 5, 6),sudoku[8][0]候选为(5, 6);sudoku[4][0]填写4,sudoku[6][0]候选为(3, 5),sudoku[7][0]候选为(5, 6),sudoku[8][0]候选为(5, 6);sudoku[6][0]填写5,sudoku[7][0]候选为(6),sudoku[8][0]候选为(6);那么sudoku[7][0]填了6之后sudoku[8][0]就没有候选数字可填了
至于如何遍历所有的情况,我们可以这样来:
把候选数字都按大小从小到大排序,用一个栈记录已经选取过的候选数字在这个序列中的序号,每一次选取候选数字就入栈,每一次回溯就出栈。另外需要注意的是每一次改变格子数字的操作都需要更新候选数字。伪码如下(注意,这只是表达思想,代码在如果按执行顺序来是有误的):
3: while(true) {
if(candidates[row][col] != NULL) {
//当前格子填写第idx个候选数字, idx = 0,1,2,3...
sudoku[row][col] = candidates[row][col](idx);
//如果所有的格子都填了,那么就把这个解保存起来,然后回溯
if(allBlanked()) {
solutions.add();
backtrace(row, col);
//idx入栈以记录已经填过的候选数字
s.push(idx);
//更新候选数字
updateCandidates();
//填写下一行
next(row, col);
else {//如果没有了候选数字就回到上一格填过的位置
backtrace(row, col);
//回溯到原点就结束
if(s.isEmpty()) {
//获取上一格填写的数字的序号,这次应该填写下一个候选数字了,即序号加1
idx = s.pop() + 1;
1: New game:
12: Solution: 1
22: Solution: 2
32: Solution: 3
42: Solution: 4
52: Solution: 5
1: New game:
12: Solution: 1
22: Solution: 2
32: Solution: 3
42: Solution: 4
52: Solution: 5
62: Solution: 6
72: Solution: 7
82: Solution: 8
1: New game:
12: Solution: 1
22: Solution: 2
32: Solution: 3
45: Solution: 235
55: Solution: 236
65: Solution: 237
Implementations : (代码是大二学期末的算法分析课程实习上写的,纯原创,当时用Qt写过一个界面设计了一个数独游戏,但是出于当时时间紧张没有做得很好,所以这里就不贴了,等以后有空完善好了再在Qt栏目里面贴出来,因为当时的代码存在小漏洞,这个版本修改了那个漏洞,原博文出于我的网易博客,因为今天是10月的最后一天了,再不加一篇博文,首页的那个“恒”就没了 = =!)
Qt游戏的那个截图:
Java源码:
Java测试源码:
@Ggicci 本文属于个人学习笔记,如有错误,希望您能指正!转载请注明出处,谢谢 :) [CSDN博客]
作者的其他最新博客
评论 ( 个评论)数独游戏,求解【廊坊吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:556,047贴子:
数独游戏,求解收藏
利用逻辑和推理,在其他的空格内填入1-9的数字。使1-9每个数字在每一行、每一列和每一宫中都只出现一次。黑色是原始数据,红色是我自己填的,卡这里了,求高手指点突破口。
求解啊 请你吃饭
那是我兄弟 呵呵
你也是魔蝎座? 好巧
登录百度帐号

我要回帖

更多关于 数独解算器 的文章

 

随机推荐