这个数独九宫格数独游戏怎么玩怎么做

700万小时搞定最小数独问题 | 科学人 | 果壳网 科技有意思
700万小时搞定最小数独问题
本文作者:sqybi
刚刚迈入 2012 年,数学界就有一个不大不小的收获。三位爱尔兰数学家发表了一篇论文,证明了数独至少需要 17 个初始数字才有唯一解。这个问题很难吗?其实一点也不,计算机才花了 700 万小时的 CPU 时间(CPU时间指CPU上执行指定代码的时钟周期数乘以每个时钟周期的时间长度)就搞定了这道数独题。这 700 万个小时它了做了什么?是三位数学家的方法很笨才导致算了这么久吗?实际上,这个时间已经不算长了。看看死理性派的详细介绍你就知道了。
数独游戏和长久以来的世界难题
18 世纪末,瑞士数学家欧拉发明了一种叫做“拉丁方阵(Latin Square)”的游戏。虽然最初这个游戏并没有风靡起来,但随着时间的推移,在 20 世纪 70 年代的美国,这个游戏以“数字拼图(Number Place)”的名字迅速流行起来,之后逐渐流传到日本、英国,到现在已经成为了红遍全球的智力游戏。
数独游戏基本规则是这样的:在一个九宫格中给出一些初始数字。玩家需要在九宫格内填入缺失的数字(1 - 9),保证:
每一行的 9 个数字各不相同
每一列的 9 个数字各不相同
每一个用粗线标识出的 3 × 3 的小正方形内 9 个数字也各不相同
虽然规则非常简单,但其中包含的信息却毫不简单。数学家 Bertram Felgenhauer 在 2005 年证明,数独的解共有 9! × 722 × 27 × 27,704,267,971 种不同的可能组合,上面这个乘式的最后一个数还是一个质数。
一个经典的数独。图像来源:wikipedia
而如此多变的变化,无疑也给数学家们出了不少难题。其中一个被讨论了很久的问题是, 至少给定多少个初始数字,数独才会有唯一解? 此前已经有人给出了一些包含 17 个初始数字的数独,并利用计算机证明了其解是唯一的(对于某个给定了 17 个初始数字的数独,计算机枚举了所有可能的排列情况,只找到一个解),从而证明了 17 个初始数字的数独是可以存在唯一解的。但是长久以来都没有人知道, 16 个初始数字的数独是否存在唯一解。终于,在 2012 的元旦,都柏林大学(University College Dublin)的数学家们给出了 答案:16 个初始数字的数独不存在唯一解。
有没有解试出来
消息一出,媒体争相报道,报道中不乏复杂的算法、超级计算机等“虽然不知道在说什么,但看起来很厉害”的词汇。事实上,研究人员用来证明这个问题的方法用一个字就可以总结,那就是——试。
解决这个问题几位数学家最初的想法非常可爱: 只要把每一种有 16 个初始数字的数独都尝试着填一遍,自然就知道答案了。
但很可惜,因为数独的组合实在是太多了,所以即使是现在最快的计算机,也不可能在我们的有生之年穷尽所有的组合。因此,必须用一些数学的方法来减少尝试的次数,这个想法才能够实现。
他们发现,数独虽然有很多种可能的组合,但是其中一些其实是等价的。如下图,可以看到交换第一列和第二列对整个数独并没有影响。实际上任意一个合法数独的解交换两列后,都可以构成一个新的合法数独,而这个新数独和原数独就可以看做是等价的。
两种等价的数独组合
三位数学家总结了数独的 4 种等价变换:
⒈ 列与列的重新排列(例如上图)
⒉ 行与行的重新排列
⒊ 数字 1 到 9 的重新排列。如把原先是 1 的位置都填上 2,然后把原先是 2 的位置都填上……直到把原先是 9 的位置都填上 1 等
⒋ 网格的变换。如整个数独顺时针旋转90度,整个数独做镜像对称等
在 2006 年已经有数学家证明,排除以上几种重复后,数独总共有 5,475,730,538 个等价类。因为每个等价类里的任意一种情况都可以通过这个等价类中的其它情况经由以上 4 种变换得到,所以对每个等价类来说,我们只要考虑一种情况即可。如此一来,有非常多的组合都被我们直接排除了,计算量大大减小。
让枚举量少一点,再少一点
虽然等价类的数量已经降低到了可以接受的范围,但问题还远没有结束。因为在选择了某个等价类中的一种情形之后,我们还需要验证这个情形的 81 个数字中是否可以选出 16 个,使得以这 16 个数为初始数字的数独有唯一解。
如果检查所有的可能情况,对于每一个等价类,我们要检查的次数就是:
这显然很不幸:好不容易通过排除等价变换的方法把计算量减下去,怎么能在这里再加回来呢!所以这又需要数学家再做一些工作,把 3.4 × 10 16 这个数减小,让枚举量少一点,再少一点。
因此,几位数学家利用了 “不可避免集”的概念:如下图所示,如果表示颜色的 4 个数字中任何一个都没有在初始数字中给出,那么这个数独一定没有唯一解——因为在没有给出的情况下这 4 个数字都是由玩家填进去的,玩家既可以以左图的方式填入这 4 个数字,也可以以右图的方式填入,而得到的两个解都是合法的。具有这种属性的数个方格就叫做不可避免集,一旦出现了不可避免集,我们就必须要在其中至少选出一个格子用来填写初始数字。
不可避免集
不可避免集大大化简计算量
在论文中,数学家们采用了 Ed Russell 总结的一套不可避免集的模板,总共记录了 525 种不同的不可避免集。因为一开始所说的 4 种等价变换对不可避免集也适用,所以他们对不可避免集进行了一些标准化的处理,以保证这 525 种不可避免集互相之间不能通过 4 种等价变换得到。
此时,枚举算法就被改造成这样:数学家给所有的不可避免集都设定一个状态,分为“被击中”或“未被击中”两种。初始时九宫格 81 个方格内都没有填入数字,所有不可避免集的初始状态均为“未被击中”。之后开始每次选择一个最小的未被击中的不可避免集,枚举其中的每个格子。即每次选择不可避免集中的一个格子填充初始数字,直至试完不可避免集中的所有空格。同时将这个不可避免集标记为“被击中”状态,每次枚举都有 4 种可能。
● 如果这个格子也出现在了其它不可避免集中,那么将这些被涉及到的不可避免集也标记为“被击中”状态;
● 如果枚举了 16 个格子后还有不可避免集未被击中,说明以这 16 个格子为初始状态的数独一定没有唯一解;
● 恰好枚举了 16 个格子后所有的不可避免集全部被击中;
● 如果枚举了不到 16 个格子后所有不可避免集已经全部被击中,则从剩下的所有格子中再枚举几个格子使初始填充了数字的格子达到 16 个。
完成上面这个工作后,就要用解数独的程序来验证所有枚举的情况是否有唯一解。为了进一步加快枚举速度,数学家们还加入了一些可行性剪枝和最优化剪枝,如提前判断“当前情况下已经不可能击中所有不可避免集”并终止枚举等。
在这一系列优化之后,算法的复杂度终于降低到了可以接受的范围内。但即使这样,整个计算过程还是耗费了 700 万小时的 CPU 时间。幸而这个算法最终给出了一个确定的结果:所有仅包含 16 个初始数字的数独,都不存在唯一解!
暴力与美学的结合
当然,上述结果的正确性还有待其他科学家进一步验证,因为算法耗时极高,所以验证过程也需要花费比较长的时间。但无论这次 3 位数学家给出的结论正确与否,随着验算结果的公布,这个问题终将得到一个解答。
粗略看来,这个算法的实现是非常暴力和机械化的:尝试每一种可能的情况。但是在实现的过程中,数学家们又在借助于数学的力量,不断地试图减少枚举的数量,最终将不可能的事情化为了现实。怪不得西澳大利亚大学的数学家 Gordon Royle 这样评价道:“这个挑战性的问题让人们把计算的能力和数学的技巧发挥到了极限,这就像是在攀登最高耸的山峰。”
现在关于数独的 puzzle 越来越难越来越精彩了。你做过的最难的数独是什么?在这里抛一块砖:
参考资料: There is no 16-Clue Sudoku: Solving the Sudoku Minimum Number of Clues Problem
你可能感兴趣
看不懂。?
这个答案给我。
你们这些人类都在用计算机做神马啊!
求17个数字的数独。。
700万小时我还是利用这个时间去冬眠吧
经济学爱好者
为什么最后一题只有16个数?
计算机科学与工程专业本科生,口琴控,动漫迷
的回应:为什么最后一题只有16个数?因为有附加条件。。。
求非穷举证明的方法~
计算机科学与工程专业本科生,口琴控,动漫迷
的回应:求非穷举证明的方法~如果有的话就不用这么累了!
计算机科学与工程专业本科生,口琴控,动漫迷
的回应:700万小时我还是利用这个时间去冬眠吧700万小时是CPU时间。。。有好多好多的CPU们一起努力工作呢☆
什么叫“700 万小时的 CPU 时间”700万小时是29.17万天是0.08万年是800年啊
计算机科学与工程专业本科生,口琴控,动漫迷
的回应:什么叫“700 万小时的 CPU 时间”700万小时是29.17万天是0.08万年是800年啊CPU时间指CPU上执行指定代码的时钟周期数乘以每个时钟周期的时间长度。。。如果有10000个CPU同时运行代码,那么700万小时的CPU时间只要一个月就可以跑完了。
的回应:这个答案给我。
的回应:求17个数字的数独。。你去找
的回应:为什么最后一题只有16个数?你来都来了,就不能推荐一下么……
声明不是我解出来的
经济学爱好者
的回应:因为有附加条件。。。也就是说,看起来是限制条件,其实反而提供了额外信息,降低了复杂度。
“让枚举量少一点,再少一点”里的图中右边那货也是合法的?
的回应:声明不是我解出来的用PS稍微写好看一点……慢了五分钟解出来啊
的回应:“让枚举量少一点,再少一点”里的图中右边那货也是合法的?THX 哎呀 谢谢谢谢 马上来改
楼主最后一题
的回应:声明不是我解出来的原来我慢了好多啊引用
的回应:用PS稍微写好看一点……慢了五分钟解出来啊
理论物理学硕士在读,维基百科小组管理员
LZ可以参考一下信息学奥赛里的相关资料,这里积累了很多关于数独的问题
的回应:LZ可以参考一下信息学奥赛里的相关资料,这里积累了很多关于数独的问题DLX =v=
计算机科学与工程专业本科生,口琴控,动漫迷
的回应:DLX =v=引用
的回应:LZ可以参考一下信息学奥赛里的相关资料,这里积累了很多关于数独的问题想当初那篇论文还是我翻译的。。。哈哈哈口胡了,其实是吴豪同学完成了最主要的工作,我只是帮忙翻译一小部分然后校对一下啥的。。。顺便@ 下楼上的童鞋
如果有兴趣的话可以看一下这篇Knuth的论文 这个算法用在解数独上效果还是不错的
的回应:想当初那篇论文还是我翻译的。。。哈哈哈口胡了,其实是吴豪同学完成了最主要的工作,我只是帮忙翻译一小部分然后校对一下啥的。。。顺便@ 下楼上的童鞋
如果有兴趣的话可以看一下这篇Knuth的论文 这个算法用在解数独上效果还是不错的 ForbiddenYou don't have permission to access /works/dlxcn/ on this server.Additionally, a 404 Not Found error was encountered while trying to use an ErrorDocument to handle the request.
配图让数独控伤不起啊,有木有....
计算机科学与工程专业本科生,口琴控,动漫迷
的回应:ForbiddenYou don't have permission to access /works/dlxcn/ on this server.Additionally, a 404 Not Found error was encountered while trying to use an ErrorDocument to handle the request.Ctrl+F5刷新下呢。。。我貌似设置了不能外链。。。囧
理论物理学硕士在读,维基百科小组管理员
的回应:想当初那篇论文还是我翻译的。。。哈哈哈口胡了,其实是吴豪同学完成了最主要的工作,我只是帮忙翻译一小部分然后校对一下啥的。。。顺便@ 下楼上的童鞋
如果有兴趣的话可以看一下这篇Knuth的论文 这个算法用在解数独上效果还是不错的 2个月前刚刚参加完信息学竞赛,现在已经淡出了……顺便看到一眼……想起来了,等将来有机会我会看的,嗯
的回应:你们这些人类都在用计算机做神马啊!难道你不是人类吗?
显示所有评论
(C)2017果壳网&&&&京ICP证100430号&&&&京网文[-239号&&&&新出发京零字东150005号&&&&
违法和不良信息举报邮箱:&&&&举报电话:增强智力 玩学并用 探索九宫格数独棋的奥秘
字号:A-|A+
数独是一种运用纸、笔进行演算的逻辑游戏。玩家需要根据盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个粗线宫内的数字均相应的范围内,不重复。根据难易程度又分为,四宫格、六宫格、九宫格。利用逻辑和推理,在其他的空格上填入相应数字。使每个数字在每一行、每一列和每一宫中都只出现一次。今天小编就和大家一起分享这款,独特而又充满智慧的益智玩具。
数独棋采用书夹式包装设计,方便携带。单从外观来看,就像一本硬质封面记事本,做工精致。书夹式包装,收纳方便,封面背部的松紧绑带,即可以固定夹层,又可以悬挂教学使用,非常适合早教机构、家庭使用。
这款数独棋共有340套题目,难度由浅入深,四宫格120题、六宫格100题、九宫格120题。使用手册、题目答案与棋盘一体装订,不用担心遗漏,缺失等问题。
题目和答案
&数独棋子共有红、黄、绿种颜色,黄色颗,绿色颗,红色颗。题目用一种颜色,答案用一种颜色,如棋子遗失,赠送的颗红色棋子可替补上场。棋子采用磁性铁块,既环保磁性又强,棋子贴在棋盘上稳牢吸附不易掉落。
&棋子的正面和背面&
本站特聘法律顾问:于国富律师
Copyright (C)
onlinedown.net数独游戏-九宫格
花了一天时间做的,高中时玩过的数独游戏,九宫格, 原创!!代码片段 1效果预览&!doctype html&
&html lang=&en& class=&&&
&meta charset=&utf-8&&
&title&&/title&
&!-- &script src=&js/jquery-1.11.0.min.js&&&/script& --&
&script src=&/jquery/1.11.1/jquery.min.js&&&/script&
table#rowcol {
border-collapse:
width: 270
margin: 20
background-color: #
#rowcol td {
height: 24
border: 1px solid #
text-align:
#rowcol tr:nth-child(3) td {
border-bottom: #000 solid 2
#rowcol tr:nth-child(6) td {
border-bottom: #000 solid 2
/* .bor-l0 {
border-left-color:#000;
#rowcol tr td:nth-child(3) {
border-right: #000 solid 2
#rowcol tr td:nth-child(6) {
border-right: #000 solid 2
#rowcol input {
height: 24
font-size: 18
line-height: 24
text-align:
#rowcol .to-fill {
background-color: #0
p.change {
width: 500
margin: 10
.change input {
padding: 10px 20
background-color: #f60;
border-radius: 5
text-align:
&h1 style=&width:500margin:auto&&数独游戏,九宫格,会玩的可以测试一下反应速度,不会玩的百度去吧!&/h1&
&!-- &p style=&line-height:28&&&span style=&color:#f60&&1408****9149&/span&
&a href='javascript:void();' class='sendmobile'&发送到手机&/a&
&input type=&text& onkeyup=&value=value.replace(/^0|[^0-9]/g,'')&&
&input type=&text& onkeyup=&console.log(event.keyCode)&& contenteditable--&
&table id=&rowcol&&
&input type=&text& maxlength=&1& value=&1&&
&input type=&text& maxlength=&1& value=&2&&
&td class=&bor-l0&&
&input type=&text& maxlength=&1& value=&3&&
&input type=&text& maxlength=&1& value=&4&&
&input type=&text& maxlength=&1& value=&5&&
&td class=&bor-l0&&
&input type=&text& maxlength=&1& value=&6&&
&input type=&text& maxlength=&1& value=&7&&
&input type=&text& maxlength=&1& value=&8&&
&input type=&text& maxlength=&1& value=&9&&
&input type=&text& maxlength=&1& value=&4&&
&input type=&text& maxlength=&1& value=&5&&
&input type=&text& maxlength=&1& value=&6&&
&input type=&text& maxlength=&1& value=&7&&
&input type=&text& maxlength=&1& value=&8&&
&input type=&text& maxlength=&1& value=&9&&
&input type=&text& maxlength=&1& value=&1&&
&input type=&text& maxlength=&1& value=&2&&
&input type=&text& maxlength=&1& value=&3&&
&tr class=&bor-b0&&
&input type=&text& maxlength=&1& value=&7&&
&input type=&text& maxlength=&1& value=&8&&
&input type=&text& maxlength=&1& value=&9&&
&input type=&text& maxlength=&1& value=&1&&
&input type=&text& maxlength=&1& value=&2&&
&input type=&text& maxlength=&1& value=&3&&
&input type=&text& maxlength=&1& value=&4&&
&input type=&text& maxlength=&1& value=&5&&
&input type=&text& maxlength=&1& value=&6&&
&input type=&text& maxlength=&1& value=&2&&
&input type=&text& maxlength=&1& value=&3&&
&input type=&text& maxlength=&1& value=&4&&
&input type=&text& maxlength=&1& value=&5&&
&input type=&text& maxlength=&1& value=&6&&
&input type=&text& maxlength=&1& value=&7&&
&input type=&text& maxlength=&1& value=&8&&
&input type=&text& maxlength=&1& value=&9&&
&input type=&text& maxlength=&1& value=&1&&
&input type=&text& maxlength=&1& value=&5&&
&input type=&text& maxlength=&1& value=&6&&
&input type=&text& maxlength=&1& value=&7&&
&input type=&text& maxlength=&1& value=&8&&
&input type=&text& maxlength=&1& value=&9&&
&input type=&text& maxlength=&1& value=&1&&
&input type=&text& maxlength=&1& value=&2&&
&input type=&text& maxlength=&1& value=&3&&
&input type=&text& maxlength=&1& value=&4&&
&tr class=&bor-b0&&
&input type=&text& maxlength=&1& value=&8&&
&input type=&text& maxlength=&1& value=&9&&
&input type=&text& maxlength=&1& value=&1&&
&input type=&text& maxlength=&1& value=&2&&
&input type=&text& maxlength=&1& value=&3&&
&input type=&text& maxlength=&1& value=&4&&
&input type=&text& maxlength=&1& value=&5&&
&input type=&text& maxlength=&1& value=&6&&
&input type=&text& maxlength=&1& value=&7&&
&input type=&text& maxlength=&1& value=&3&&
&input type=&text& maxlength=&1& value=&4&&
&input type=&text& maxlength=&1& value=&5&&
&input type=&text& maxlength=&1& value=&6&&
&input type=&text& maxlength=&1& value=&7&&
&input type=&text& maxlength=&1& value=&8&&
&input type=&text& maxlength=&1& value=&9&&
&input type=&text& maxlength=&1& value=&1&&
&input type=&text& maxlength=&1& value=&2&&
&input type=&text& maxlength=&1& value=&6&&
&input type=&text& maxlength=&1& value=&7&&
&input type=&text& maxlength=&1& value=&8&&
&input type=&text& maxlength=&1& value=&9&&
&input type=&text& maxlength=&1& value=&1&&
&input type=&text& maxlength=&1& value=&2&&
&input type=&text& maxlength=&1& value=&3&&
&input type=&text& maxlength=&1& value=&4&&
&input type=&text& maxlength=&1& value=&5&&
&input type=&text& maxlength=&1& value=&9&&
&input type=&text& maxlength=&1& value=&1&&
&input type=&text& maxlength=&1& value=&2&&
&input type=&text& maxlength=&1& value=&3&&
&input type=&text& maxlength=&1& value=&4&&
&input type=&text& maxlength=&1& value=&5&&
&input type=&text& maxlength=&1& value=&6&&
&input type=&text& maxlength=&1& value=&7&&
&input type=&text& maxlength=&1& value=&8&&
&!-- &p class=&change&&
&input type=&text& name=&row1& id=&row1&&行:
&input type=&text& name=&row2& id=&row2&&
&button id=&changeRow&&交换&/button&(只能交换1-3,4-6,7-9内的行)&/p&
&p class=&change&&
&input type=&text& name=&col1& id=&col1&&列:
&input type=&text& name=&col2& id=&col2&&
&button id=&changeCol&&交换&/button&(只能交换1-3,4-6,7-9内的列)&/p& --&
&p class=&change&&
&input type=&text& name=&row1& id=&row1& value=&1&&
&button id=&rowUp&&上移&/button&
&button id=&rowDown&&下移&/button& (可用上下方向键移动)
&p class=&change&&
&input type=&text& name=&col1& id=&col1& value=&1&&
&button id=&colLeft&&左移&/button&
&button id=&colRight&&右移&/button& (可用左右方向键移动)
&p class=&change&&
&select name=&& id=&& class=&selLevel&&
&option value=&0&&请选择&/option&
&option value=&1&&容易&/option&
&option value=&2&&一般&/option&
&option value=&3&&中等&/option&
&option value=&4&&较难&/option&
&option value=&5&&很难&/option&
&button class=&fill1&&特殊矩形1&/button&
&button class=&fill2&&特殊矩形2&/button&
&button class=&fillX1&&X形1&/button&
&button class=&fillX2&&X形2&/button&
&p class=&tc change&&
&button id=&check&&检查结果&/button&
var tds = [1, 2, 3, 4, 5, 6, 7, 8, 9, 4, 5, 6, 7, 8, 9, 1, 2, 3, 7, 8, 9, 1, 2, 3, 4, 5, 6, 2, 3, 4, 5, 6, 7, 8, 9, 1, 5, 6, 7, 8, 9, 1, 2, 3, 4, 8, 9, 1, 2, 3, 4, 5, 6, 7, 3, 4, 5, 6, 7, 8, 9, 1, 2, 6, 7, 8, 9, 1, 2, 3, 4, 5, 9, 1, 2, 3, 4, 5, 6, 7, 8],
numArr = [];
$(function() {
(function shuffleRandom(n) {
var i = 0,
ran, rc, move,
for (; i & i++) {
ran = Math.random().toFixed(3),
rc = ran & 0.5 ? 1 : 0,
move = ran * 1000 % 2 == 1 ? 1 : 0,
rcval = Math.floor(Math.random() * 9) + 1;
shuffleRowCol(rc, rcval, move);
for (var i = 0; i & 81; i++) {
numArr[i] =
shuffleUseSort = function(aArr) {
return aArr.sort(function(a, b) {
return (0.5 - Math.random());
shuffleUseSort(numArr);
$(&#rowcol input&).each(function() {
tds.push(+this.value);
this.value = &&;
fillRect = function(arr) {
var emptyRect = function(arrs) {
var i = 0,
emptys = [0, 1, 2, 9, 10, 11, 18, 19, 20],
nRect = [0, 0, 3, 6, 27, 30, 33, 54, 57, 60],
totals = [];
if ($.isArray(arrs)) {
$.each(arrs, function() {
for (; i & arrs. i++) {
totals = totals.concat($.map(emptys, function(val) {
return nRect[arrs[i]] +
$(&#rowcol input&).each(function(i) {
$(this).removeClass(&to-fill&).val(tds[i]);
$.each(emptyRect(arr), function(i, val) {
$(&#rowcol input:eq(& + val + &)&).val(&&).attr(&class&, &to-fill&);
fillX = function(fill) {
var i, fillArr = [];
for (i = 0; i & 8; i++) {
fillArr.push(9 * i + i + 1);
fillArr.push(9 * i + 7 - i);
for (i = 1; i & 9; i++) {
fillArr.push(9 * i + i - 1);
fillArr.push(9 * i + 9 - i);
if (fill) {
$(&#rowcol input&).each(function(i) {
$(this).removeClass(&to-fill&).val(tds[i]);
$.each(fillArr, function(i, val) {
$(&#rowcol input:eq(& + val + &)&).val(&&).attr(&class&, &to-fill&);
$(&#rowcol input&).addClass(&to-fill&).val(&&);
$.each(fillArr.sort(function(a, b) {
return a - b
}), function(i, val) {
$(&#rowcol input:eq(& + val + &)&).val(tds[val]).removeClass(&to-fill&);
$(&.fill1&).on(&click&, function() {
fillRect([1, 3, 7, 9]);
$(&.fill2&).on(&click&, function() {
fillRect([2, 4, 6, 8]);
$(&.fillX1&).on(&click&, function() {
$(&.fillX2&).on(&click&, function() {
$(&#rowcol&).on(&keyup&, function(e) {
var index = $(e.target).index(&#rowcol input&),
if (e.keyCode == 38) {
if (index & 8) {
$(&#rowcol input&).eq(index - 9).focus();
$(&#rowcol input&).eq(index + 72).focus();
} else if (e.keyCode == 40) {
if (index & 71) {
$(&#rowcol input&).eq(index - 72).focus();
$(&#rowcol input&).eq(index + 9).focus();
} else if (e.keyCode & 48 && e.keyCode & 58) {
tar.value = e.keyCode - 48;
} else if (e.keyCode == 37) {
if (index % 9 & 0) {
$(&#rowcol input&).eq(index - 1).focus();
$(&#rowcol input&).eq(index + 8).focus();
} else if (e.keyCode == 39) {
if ((index + 1) % 9 == 0) {
$(&#rowcol input&).eq(index - 8).focus();
$(&#rowcol input&).eq(index + 1).focus();
tar.value = 1;
$(&.change input&).on(&keyup&, function(e) {
var rowval,
this.value = this.value.replace(/[^1-9]/, &&).replace(/\d(\d)/, &]&!doctype html&
&html lang=&en& class=&&&
&meta charset=&utf-8&&
&title&&/title&
&!-- &script src=&js/jquery-1.11.0.min.js&&&/script& --&
&script src=&/jquery/1.11.1/jquery.min.js&&&/script&
table#rowcol {
border-collapse:
width: 270
margin: 20
background-color: #
#rowcol td {
height: 24
border: 1px solid #
text-align:
#rowcol tr:nth-child(3) td {
border-bottom: #000 solid 2
#rowcol tr:nth-child(6) td {
border-bottom: #000 solid 2
/* .bor-l0 {
border-left-color:#000;
#rowcol tr td:nth-child(3) {
border-right: #000 solid 2
#rowcol tr td:nth-child(6) {
border-right: #000 solid 2
#rowcol input {
height: 24
font-size: 18
line-height: 24
text-align:
#rowcol .to-fill {
background-color: #0
p.change {
width: 500
margin: 10
.change input {
padding: 10px 20
background-color: #f60;
border-radius: 5
text-align:
&h1 style=&width:500margin:auto&&数独游戏,九宫格,会玩的可以测试一下反应速度,不会玩的百度去吧!&/h1&
&!-- &p style=&line-height:28&&&span style=&color:#f60&&1408****9149&/span&
&a href='javascript:void();' class='sendmobile'&发送到手机&/a&
&input type=&text& onkeyup=&value=value.replace(/^0|[^0-9]/g,'')&&
&input type=&text& onkeyup=&console.log(event.keyCode)&& contenteditable--&
&table id=&rowcol&&
&input type=&text& maxlength=&1& value=&1&&
&input type=&text& maxlength=&1& value=&2&&
&td class=&bor-l0&&
&input type=&text& maxlength=&1& value=&3&&
&input type=&text& maxlength=&1& value=&4&&
&input type=&text& maxlength=&1& value=&5&&
&td class=&bor-l0&&
&input type=&text& maxlength=&1& value=&6&&
&input type=&text& maxlength=&1& value=&7&&
&input type=&text& maxlength=&1& value=&8&&
&input type=&text& maxlength=&1& value=&9&&
&input type=&text& maxlength=&1& value=&4&&
&input type=&text& maxlength=&1& value=&5&&
&input type=&text& maxlength=&1& value=&6&&
&input type=&text& maxlength=&1& value=&7&&
&input type=&text& maxlength=&1& value=&8&&
&input type=&text& maxlength=&1& value=&9&&
&input type=&text& maxlength=&1& value=&1&&
&input type=&text& maxlength=&1& value=&2&&
&input type=&text& maxlength=&1& value=&3&&
&tr class=&bor-b0&&
&input type=&text& maxlength=&1& value=&7&&
&input type=&text& maxlength=&1& value=&8&&
&input type=&text& maxlength=&1& value=&9&&
&input type=&text& maxlength=&1& value=&1&&
&input type=&text& maxlength=&1& value=&2&&
&input type=&text& maxlength=&1& value=&3&&
&input type=&text& maxlength=&1& value=&4&&
&input type=&text& maxlength=&1& value=&5&&
&input type=&text& maxlength=&1& value=&6&&
&input type=&text& maxlength=&1& value=&2&&
&input type=&text& maxlength=&1& value=&3&&
&input type=&text& maxlength=&1& value=&4&&
&input type=&text& maxlength=&1& value=&5&&
&input type=&text& maxlength=&1& value=&6&&
&input type=&text& maxlength=&1& value=&7&&
&input type=&text& maxlength=&1& value=&8&&
&input type=&text& maxlength=&1& value=&9&&
&input type=&text& maxlength=&1& value=&1&&
&input type=&text& maxlength=&1& value=&5&&
&input type=&text& maxlength=&1& value=&6&&
&input type=&text& maxlength=&1& value=&7&&
&input type=&text& maxlength=&1& value=&8&&
&input type=&text& maxlength=&1& value=&9&&
&input type=&text& maxlength=&1& value=&1&&
&input type=&text& maxlength=&1& value=&2&&
&input type=&text& maxlength=&1& value=&3&&
&input type=&text& maxlength=&1& value=&4&&
&tr class=&bor-b0&&
&input type=&text& maxlength=&1& value=&8&&
&input type=&text& maxlength=&1& value=&9&&
&input type=&text& maxlength=&1& value=&1&&
&input type=&text& maxlength=&1& value=&2&&
&input type=&text& maxlength=&1& value=&3&&
&input type=&text& maxlength=&1& value=&4&&
&input type=&text& maxlength=&1& value=&5&&
&input type=&text& maxlength=&1& value=&6&&
&input type=&text& maxlength=&1& value=&7&&
&input type=&text& maxlength=&1& value=&3&&
&input type=&text& maxlength=&1& value=&4&&
&input type=&text& maxlength=&1& value=&5&&
&input type=&text& maxlength=&1& value=&6&&
&input type=&text& maxlength=&1& value=&7&&
&input type=&text& maxlength=&1& value=&8&&
&input type=&text& maxlength=&1& value=&9&&
&input type=&text& maxlength=&1& value=&1&&
&input type=&text& maxlength=&1& value=&2&&
&input type=&text& maxlength=&1& value=&6&&
&input type=&text& maxlength=&1& value=&7&&
&input type=&text& maxlength=&1& value=&8&&
&input type=&text& maxlength=&1& value=&9&&
&input type=&text& maxlength=&1& value=&1&&
&input type=&text& maxlength=&1& value=&2&&
&input type=&text& maxlength=&1& value=&3&&
&input type=&text& maxlength=&1& value=&4&&
&input type=&text& maxlength=&1& value=&5&&
&input type=&text& maxlength=&1& value=&9&&
&input type=&text& maxlength=&1& value=&1&&
&input type=&text& maxlength=&1& value=&2&&
&input type=&text& maxlength=&1& value=&3&&
&input type=&text& maxlength=&1& value=&4&&
&input type=&text& maxlength=&1& value=&5&&
&input type=&text& maxlength=&1& value=&6&&
&input type=&text& maxlength=&1& value=&7&&
&input type=&text& maxlength=&1& value=&8&&
&!-- &p class=&change&&
&input type=&text& name=&row1& id=&row1&&行:
&input type=&text& name=&row2& id=&row2&&
&button id=&changeRow&&交换&/button&(只能交换1-3,4-6,7-9内的行)&/p&
&p class=&change&&
&input type=&text& name=&col1& id=&col1&&列:
&input type=&text& name=&col2& id=&col2&&
&button id=&changeCol&&交换&/button&(只能交换1-3,4-6,7-9内的列)&/p& --&
&p class=&change&&
&input type=&text& name=&row1& id=&row1& value=&1&&
&button id=&rowUp&&上移&/button&
&button id=&rowDown&&下移&/button& (可用上下方向键移动)
&p class=&change&&
&input type=&text& name=&col1& id=&col1& value=&1&&
&button id=&colLeft&&左移&/button&
&button id=&colRight&&右移&/button& (可用左右方向键移动)
&p class=&change&&
&select name=&& id=&& class=&selLevel&&
&option value=&0&&请选择&/option&
&option value=&1&&容易&/option&
&option value=&2&&一般&/option&
&option value=&3&&中等&/option&
&option value=&4&&较难&/option&
&option value=&5&&很难&/option&
&button class=&fill1&&特殊矩形1&/button&
&button class=&fill2&&特殊矩形2&/button&
&button class=&fillX1&&X形1&/button&
&button class=&fillX2&&X形2&/button&
&p class=&tc change&&
&button id=&check&&检查结果&/button&
var tds = [1, 2, 3, 4, 5, 6, 7, 8, 9, 4, 5, 6, 7, 8, 9, 1, 2, 3, 7, 8, 9, 1, 2, 3, 4, 5, 6, 2, 3, 4, 5, 6, 7, 8, 9, 1, 5, 6, 7, 8, 9, 1, 2, 3, 4, 8, 9, 1, 2, 3, 4, 5, 6, 7, 3, 4, 5, 6, 7, 8, 9, 1, 2, 6, 7, 8, 9, 1, 2, 3, 4, 5, 9, 1, 2, 3, 4, 5, 6, 7, 8],
numArr = [];
$(function() {
(function shuffleRandom(n) {
var i = 0,
ran, rc, move,
for (; i & i++) {
ran = Math.random().toFixed(3),
rc = ran & 0.5 ? 1 : 0,
move = ran * 1000 % 2 == 1 ? 1 : 0,
rcval = Math.floor(Math.random() * 9) + 1;
shuffleRowCol(rc, rcval, move);
for (var i = 0; i & 81; i++) {
numArr[i] =
shuffleUseSort = function(aArr) {
return aArr.sort(function(a, b) {
return (0.5 - Math.random());
shuffleUseSort(numArr);
$(&#rowcol input&).each(function() {
tds.push(+this.value);
this.value = &&;
fillRect = function(arr) {
var emptyRect = function(arrs) {
var i = 0,
emptys = [0, 1, 2, 9, 10, 11, 18, 19, 20],
nRect = [0, 0, 3, 6, 27, 30, 33, 54, 57, 60],
totals = [];
if ($.isArray(arrs)) {
$.each(arrs, function() {
for (; i & arrs. i++) {
totals = totals.concat($.map(emptys, function(val) {
return nRect[arrs[i]] +
$(&#rowcol input&).each(function(i) {
$(this).removeClass(&to-fill&).val(tds[i]);
$.each(emptyRect(arr), function(i, val) {
$(&#rowcol input:eq(& + val + &)&).val(&&).attr(&class&, &to-fill&);
fillX = function(fill) {
var i, fillArr = [];
for (i = 0; i & 8; i++) {
fillArr.push(9 * i + i + 1);
fillArr.push(9 * i + 7 - i);
for (i = 1; i & 9; i++) {
fillArr.push(9 * i + i - 1);
fillArr.push(9 * i + 9 - i);
if (fill) {
$(&#rowcol input&).each(function(i) {
$(this).removeClass(&to-fill&).val(tds[i]);
$.each(fillArr, function(i, val) {
$(&#rowcol input:eq(& + val + &)&).val(&&).attr(&class&, &to-fill&);
$(&#rowcol input&).addClass(&to-fill&).val(&&);
$.each(fillArr.sort(function(a, b) {
return a - b
}), function(i, val) {
$(&#rowcol input:eq(& + val + &)&).val(tds[val]).removeClass(&to-fill&);
$(&.fill1&).on(&click&, function() {
fillRect([1, 3, 7, 9]);
$(&.fill2&).on(&click&, function() {
fillRect([2, 4, 6, 8]);
$(&.fillX1&).on(&click&, function() {
$(&.fillX2&).on(&click&, function() {
$(&#rowcol&).on(&keyup&, function(e) {
var index = $(e.target).index(&#rowcol input&),
if (e.keyCode == 38) {
if (index & 8) {
$(&#rowcol input&).eq(index - 9).focus();
$(&#rowcol input&).eq(index + 72).focus();
} else if (e.keyCode == 40) {
if (index & 71) {
$(&#rowcol input&).eq(index - 72).focus();
$(&#rowcol input&).eq(index + 9).focus();
} else if (e.keyCode & 48 && e.keyCode & 58) {
tar.value = e.keyCode - 48;
} else if (e.keyCode == 37) {
if (index % 9 & 0) {
$(&#rowcol input&).eq(index - 1).focus();
$(&#rowcol input&).eq(index + 8).focus();
} else if (e.keyCode == 39) {
if ((index + 1) % 9 == 0) {
$(&#rowcol input&).eq(index - 8).focus();
$(&#rowcol input&).eq(index + 1).focus();
tar.value = 1;
$(&.change input&).on(&keyup&, function(e) {
var rowval,
this.value = this.value.replace(/[^1-9]/, &&).replace(/\d(\d)/, &$1&);
rowval = $(&#row1&).val() ? +$(&#row1&).val() : 1,
colval = $(&#col1&).val() ? +$(&#col1&).val() : 1;
if (this.id == &row1&) {
if (e.keyCode == 38) {
shuffleRowCol(0, rowval, 0)
} else if (e.keyCode == 40) {
shuffleRowCol(0, rowval, 1)
if (e.keyCode == 37) {
shuffleRowCol(1, colval, 0)
} else if (e.keyCode == 39) {
shuffleRowCol(1, colval, 1)
$(&.change button&).on(&click&, function() {
var rowval1 = +$(&#row1&).val(),
colval1 = +$(&#col1&).val()
// chR = rowval1%3
// chRow = Math.ceil(rowval1/3)
// chC = colval1%3
// chCol = Math.ceil(colval1/3)
if (this.id == &rowUp&) {
shuffleRowCol(0, rowval1, 0)
} else if (this.id == &rowDown&) {
shuffleRowCol(0, rowval1, 1)
} else if (this.id == &colLeft&) {
shuffleRowCol(1, colval1, 0)
} else if (this.id == &colRight&) {
shuffleRowCol(1, colval1, 1)
$(&.selLevel&).change(function() {
var nu = +this.
$(&#rowcol input&).each(function(i) {
$(this).removeClass(&to-fill&).val(tds[i]);
if (nu != 0) {
for (i = 0; i & nu * 10 + 10; i++) {
$(&#rowcol input:eq(& + numArr[i] + &)&).val(&&).attr(&class&, &to-fill&);
$(&#check&).click(checkFill);
* [shuffleRowCol description]
{[num]}0 move row,1 move col
{[num]}1-9 move row or col
{[num]}0,1 0 move top or left, 1 move bottom or right
* @return {[num]}
function shuffleRowCol(rc, rcval, move) {
var chR = rcval % 3,
chRow = Math.ceil(rcval / 3) - 1,
tbl = $(&#rowcol&)[0],
tbody = $(&#rowcol tbody&)[0];
if (move) {
if (chR == 0) {
$(&#rowcol tr&).each(function() {
this.insertBefore(this.cells[rcval - 1], this.cells[chRow * 3]);
$(&#rowcol tr&).each(function() {
this.insertBefore(this.cells[rcval], this.cells[rcval - 1]);
//tbl.rows[rcval-1].insertBefore(tbl.rows[rcval-1].cells[rcval], tbl.rows[rcval-1].cells[rcval]);
if (chR == 1) {
$(&#rowcol tr&).each(function() {
$(this.cells[rcval - 1]).insertAfter(this.cells[chRow * 3 + 2])
//this.insertBefore(this.cells[rcval-1], this.cells[chRow*3 + 2]);
$(&#rowcol tr&).each(function() {
this.insertBefore(this.cells[rcval - 1], this.cells[rcval - 2]);
if (move) {
if (chR == 0) {
tbody.insertBefore(tbl.rows[rcval - 1], tbl.rows[chRow * 3]);
tbody.insertBefore(tbl.rows[rcval], tbl.rows[rcval - 1]);
if (chR == 1) {
$(tbl.rows[rcval - 1]).insertAfter($(tbl.rows[chRow * 3 + 2]))
//tbody.insertBefore(tbl.rows[rcval-1], tbl.rows[chRow*3 + 2]);
tbody.insertBefore(tbl.rows[rcval - 1], tbl.rows[rcval - 2]);
function checkFill() {
var fills = [],
rowSum = 0;
$(&#rowcol input&).each(function() {
fills.push(+this.value);
//if(arraySum(fills) !=405)
for (; i & 9; i++) {
rowSum = 0
$.each([0, 1, 2, 3, 4, 5, 6, 7, 8], function(val) {
rowSum += fills[val * 9 + i]
if (arraySum(fills.slice(i * 9, i * 9 + 9)) == 45 && rowSum == 45) {
alert(&您的输入结果不正确,请重新输入!&);
if (!confirm(&继续填写吗?&)) {
$(&.selLevel&).trigger(&change&);
alert(&恭喜您输入正确! 你真聪明!&)
function arraySum(arr) {
var i = 0,
len = arr.length,
arr.sort();
for (i; i & i++) {
if (arr[i] != i + 1) {
sum += arr[i];
rowval = $(&#row1&).val() ? +$(&#row1&).val() : 1,
colval = $(&#col1&).val() ? +$(&#col1&).val() : 1;
if (this.id == &row1&) {
if (e.keyCode == 38) {
shuffleRowCol(0, rowval, 0)
} else if (e.keyCode == 40) {
shuffleRowCol(0, rowval, 1)
if (e.keyCode == 37) {
shuffleRowCol(1, colval, 0)
} else if (e.keyCode == 39) {
shuffleRowCol(1, colval, 1)
$(&.change button&).on(&click&, function() {
var rowval1 = +$(&#row1&).val(),
colval1 = +$(&#col1&).val()
// chR = rowval1%3
// chRow = Math.ceil(rowval1/3)
// chC = colval1%3
// chCol = Math.ceil(colval1/3)
if (this.id == &rowUp&) {
shuffleRowCol(0, rowval1, 0)
} else if (this.id == &rowDown&) {
shuffleRowCol(0, rowval1, 1)
} else if (this.id == &colLeft&) {
shuffleRowCol(1, colval1, 0)
} else if (this.id == &colRight&) {
shuffleRowCol(1, colval1, 1)
$(&.selLevel&).change(function() {
var nu = +this.
$(&#rowcol input&).each(function(i) {
$(this).removeClass(&to-fill&).val(tds[i]);
if (nu != 0) {
for (i = 0; i & nu * 10 + 10; i++) {
$(&#rowcol input:eq(& + numArr[i] + &)&).val(&&).attr(&class&, &to-fill&);
$(&#check&).click(checkFill);
* [shuffleRowCol description]
{[num]}0 move row,1 move col
{[num]}1-9 move row or col
{[num]}0,1 0 move top or left, 1 move bottom or right
* @return {[num]}
function shuffleRowCol(rc, rcval, move) {
var chR = rcval % 3,
chRow = Math.ceil(rcval / 3) - 1,
tbl = $(&#rowcol&)[0],
tbody = $(&#rowcol tbody&)[0];
if (move) {
if (chR == 0) {
$(&#rowcol tr&).each(function() {
this.insertBefore(this.cells[rcval - 1], this.cells[chRow * 3]);
$(&#rowcol tr&).each(function() {
this.insertBefore(this.cells[rcval], this.cells[rcval - 1]);
//tbl.rows[rcval-1].insertBefore(tbl.rows[rcval-1].cells[rcval], tbl.rows[rcval-1].cells[rcval]);
if (chR == 1) {
$(&#rowcol tr&).each(function() {
$(this.cells[rcval - 1]).insertAfter(this.cells[chRow * 3 + 2])
//this.insertBefore(this.cells[rcval-1], this.cells[chRow*3 + 2]);
$(&#rowcol tr&).each(function() {
this.insertBefore(this.cells[rcval - 1], this.cells[rcval - 2]);
if (move) {
if (chR == 0) {
tbody.insertBefore(tbl.rows[rcval - 1], tbl.rows[chRow * 3]);
tbody.insertBefore(tbl.rows[rcval], tbl.rows[rcval - 1]);
if (chR == 1) {
$(tbl.rows[rcval - 1]).insertAfter($(tbl.rows[chRow * 3 + 2]))
//tbody.insertBefore(tbl.rows[rcval-1], tbl.rows[chRow*3 + 2]);
tbody.insertBefore(tbl.rows[rcval - 1], tbl.rows[rcval - 2]);
function checkFill() {
var fills = [],
rowSum = 0;
$(&#rowcol input&).each(function() {
fills.push(+this.value);
//if(arraySum(fills) !=405)
for (; i & 9; i++) {
rowSum = 0
$.each([0, 1, 2, 3, 4, 5, 6, 7, 8], function(val) {
rowSum += fills[val * 9 + i]
if (arraySum(fills.slice(i * 9, i * 9 + 9)) == 45 && rowSum == 45) {
alert(&您的输入结果不正确,请重新输入!&);
if (!confirm(&继续填写吗?&)) {
$(&.selLevel&).trigger(&change&);
alert(&恭喜您输入正确! 你真聪明!&)
function arraySum(arr) {
var i = 0,
len = arr.length,
arr.sort();
for (i; i & i++) {
if (arr[i] != i + 1) {
sum += arr[i];
13 总笔记数
1.1万 总阅读量
Copyright &
All Rights Reserved.
合作伙伴:}

我要回帖

更多关于 九宫格数独题目及答案 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信