这个九宫格数独的解法法

查看: 4829|回复: 14
做了个数独快速解题器,喜欢数独的下载试试
阅读权限20
在线时间 小时
本帖最后由 joforn 于
23:12 编辑
做了个自动解数独的程序,喜欢数独的朋友可以下载玩玩,速度还是挺快的。
由于本人水平有限,代码水平让高手看了会笑掉大牙,所以就不公开了。
编制中难免有错误请谅解!
01-开始.jpg (97.21 KB, 下载次数: 31)
12:27 上传
1、主界面比较简单,第一步当然是“随机出题”,
& && &第二步有两种,1是“自动解题”,2是点击11行的数字区手工解题,电脑自动用红色提示不能放置数字的位置。
02-完成.jpg (123.5 KB, 下载次数: 2)
12:28 上传
2、很多题都能自动解完,而且很快,2-8秒吧。增加了“记录”页,能记录500项记录,每完成一次解题自动记录。
03-手工标注.jpg (106.71 KB, 下载次数: 14)
12:28 上传
3、手动解题和自动解题都可设置猜点(即1个数有两个以上的位置可放置),设置了猜点后当放置错误时,可恢复猜点后重新放置,
& & 恢复猜点为0时,恢复到“随机出题”的状态,但记时不变。
附件下载:
(212 KB, 下载次数: 464)
12:38 上传
点击文件名下载附件
阅读权限20
在线时间 小时
看来喜欢数独的人不多!
阅读权限30
在线时间 小时
& & & & & & & &
想看代码。
阅读权限20
在线时间 小时
我也想看看代码。
我曾经写过一个数独解题器但是不够智能。
因为我只会行排除、列排除、九宫排除这几种基本的解法。
你公开源代码嘛。
阅读权限95
在线时间 小时
6秒时间长了点……一般应该在0.3秒内解决,少数2-3秒。
22:17 上传
点击文件名下载附件
24.18 KB, 下载次数: 230
优秀作品,太強了
优秀作品,这个作品好牛X
阅读权限20
在线时间 小时
& & & & & & & &
香川群子 发表于
6秒时间长了点……一般应该在0.3秒内解决,少数2-3秒。
你这个太神奇了,而且还有源码可看。
我自己编的那个是有点慢,主要是我的编程水平太烂了,连代码都不敢让高手看。
前两天看网上有人做了个解数独的,要1分钟左右,而且还要不停的选择猜点,我试了一下,比我的烂多了。
看来还得多向高手学习啊!
闭门造车是不行的!
阅读权限20
在线时间 小时
ammyc 发表于
想看代码。
请看5楼,谢谢回复!
阅读权限20
在线时间 小时
系统正在加载… 发表于
我也想看看代码。
我曾经写过一个数独解题器但是不够智能。
因为我只会行排除、列排除、九宫排除这几种基 ...
我用的就是行、列和小九格排除法。和你一样。所以会有猜点出现。
可以多交流!
阅读权限95
在线时间 小时
5楼的是遍历穷举剪枝算法。
本楼附件是按数独规则解题的VBA代码算法。
13:07 上传
点击文件名下载附件
39.13 KB, 下载次数: 154
优秀作品,太強了
果然还是群子的。
阅读权限20
在线时间 小时
香川群子 发表于
5楼的是遍历穷举剪枝算法。
本楼附件是按数独规则解题的VBA代码算法。
想说的就是这个问题,5楼那个根本不叫解数独,应该叫填数字更合适。
我做的是用我的解题思路一步一步解开的。
看看你这个再说:)
玩命加载中,请稍候
玩命加载中,请稍候
Powered by
本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任! & & 本站特聘法律顾问:徐怀玉律师 李志群律师你玩数独的套路是怎样的?
我发现业余数独爱好者,都有自己总结归纳的拿到题目后一二三步的填数步骤,希望大家共同交流一下
4月4抱歉,这段时间一直忙,没有时间深入玩,发现一个关于数独技巧的网站。觉得很有用,贴出共大家一起交流学习。=================3月5更新说明:答案中所说的方法都是在填出某一个数时,那一刻自己脑海中的想法,可能这个想法并不是最简的,或者与其他方法本质相同,更有甚者,可能得出结果纯粹是偶然。但,不好意思,当时就是这样想的,我如实记录而已。=================3月3多图好吧,估摸着这是个天坑,只能边玩边总结,慢慢填了......
先说几句无关的话,在手机上玩时,我最喜欢的是一个叫熊猫数独的app。界面干净简单,五种难度等级,十种不同网格模式,共计5000张数独。有兴趣的可以找去广告版试试。 我玩数独纯粹是打发时间的,所以很业余,说的不严谨还请谅解。言归正传否定法对于相对简单的数独来说,方法套数什么的没意义。从1到9的一遍遍机械地尝试这是最普遍的方法了。 或者从已存在的数字多的开始,反正就是一遍遍尝试。注意,我所说的尝试不是一个一个空格去试数字,而是就已经存在的数字去否定该数字不能存在的地方,即否定法。举例如下:
而对于中等困难极难这些难度等级的数独。这个时候光机械的这么一遍遍的排除否定,恐怕是完成不了了。这个时候,方法套数才开始发挥作用。否定法进阶之双重否定;如图:用否定法(红色线)排除后,左中小九宫格还剩下(3,4)(3,5)两个空格可以填'2'。再用否定法(蓝色线)可确定中间小九宫格,‘2’只能在(5,4)或(6,4)位置,这样(3,4)就绝对不能填‘2’了,所以左中小宫格‘2’只能在(3,5)的位置。下图同样也是双重否定,试试吧~否定法进阶之多重否定;如图:在中间小宫格中,红线否定上面三个,所以‘7’只能在(4,6)(5,6)(6,6),所以(7,6)不能是‘7’;同理,蓝色线确定(9,5)不能是‘7’;再次,紫线确定(8,4)(8,5)不能是‘7’。行少列补,列少行补;第7列还差三个数‘1’‘5’‘6’,而通过第5行有‘6’‘5’则确定(7,5)位置应该填‘1’下图第7行少四个数‘2’‘3’‘4’‘5’,通过第2列有‘2’‘4’‘3’则可确定(2,7)位置应该填‘5’然后可以否定法与之结合:。。。。。。挖坑待填。。。。。。===================================3月5更新格内缺,格外补下图左上九宫格缺数字“1”“5”“6”“9”3行1列分别有“9”“6”“1”所以,相应位置填“5”行列去除候选当否定法以及之前的一些方法都让自己难以再简单填数之后,该如图一样填写各种可能情况了(很多时候,在填候选的过程中,一些数字就自然而然的对应上位置了,这就没截图了)然后,当该行或该列如图红圈圈一样,出现相同的两个数字(惭愧,目前相同三个数字的规律还没总结出来。),就可以放心去除该行或该列其它格子中紫圈圈里相同的数字了。格内去除候选同理。双重否定+情迷第三者当双重否定后,出现相同的数字抢对应的两排,那我们就果断选择第三排吧~格内唯一选唯一,行唯一选唯一,列唯一选唯一(好像是拐了弯的法子,暂写入)下面这一图,在填候选数字时,(4,6)为什么没有“2”,我真心想不起来了至于这图,当时做的时候,确实用的候选数字在小九宫格内唯一来做的。整理时发现,其实行也唯一,列也唯一。也就是直接用否定法就可以确定啊摔!所以时刻别忘否定法。基本上,目前我玩的所有数独,只要肯花时间,运用上面的套路方法,大部分都能解出来。至于接下来那些不得不分情况讨论的数独。等我慢慢玩,再和大家分享吧~
淡化解法,逻辑为王;排除为主,标注提示;线索串联,全盘观察;步步为营,思路连贯;遇到卡点,检索遗漏;碰到难题,寻找锁链;变型题型,搞懂规则;标准思路,结合新规;没有已知,寻找破点;手工题目,揣摩圣意;实在没招,暴力破解;完成题目,心情舒爽!
先从1到9过一遍,把能填的直接填上,顺便把可能性在二选一的格子用小标记备注,会极大提高后面填字的效率,方便记忆。我的习惯是先横竖,再小九格推。小技巧很多,没例子说不清楚,自己多玩玩就摸索出来了。最后绞尽脑汁都推不出来的时候就用假设法。原则是不要蒙,不然就没意思了,要相信没有解不开的数独。最后推荐一个sudoku2的app,很好用。
这是我数独入门的时候养成的习惯.1.就是一开始1到9一个一个数字找,就是读题,把简单不动脑的检查先做了,就是把可能仅有一个数的未知格先填好作为已知条件玩到"疯掉"那个程度的时候,2.先把把每个空格可能的数字都确定好了,从少数的只有较少的数字可行的空格先开始,设成是一个已知数字的格A,在遵循几个客观原则下(1 九宫内数字1~9仅出现一次,否则空格A的假设不成立(2 同一行/列内数字1~9仅出现一次,否则空格A的假设不成立(3 其他未确定的格出现自身可能出现的数字,否则空格A的假设不成立一边做一边自检,出错就立刻推倒重做的笨方法.所以给我一个数独我就能玩很久很久....这是一个悲伤的故事,我不知道是多少次对1.无法解决的数独屈服,才开始的这条漫长的旅程...我开始2.的时候就会做了,就算全程没错,也忍不住一定要做的事3.纠错发现错误和纠正错误都是必不可少的,承认错误和重新开始需要勇气和耐性.从来就没蒙过,因为我心里明白以我的人品,蒙对的几率跟室内遭雷劈的几率是差不多的...
看了赞最多的答主,觉得太复杂了,作为一个数独爱好者我说下自己的步骤第一步:二元法刚拿到的数独一定有这么两个相同的数占着自己的九宫格,并向外延伸霸占两条线(红线),导致另一个九宫格的数只能存在一个确切的位置。刚拿到的数独一定有这么两个相同的数占着自己的九宫格,并向外延伸霸占两条线(红线),导致另一个九宫格的数只能存在一个确切的位置。第二步:占行法当用第一步都做完后,就可以尝试第二步。当用第一步都做完后,就可以尝试第二步。由2的限制可以知道右下的九宫格的2必定处于最右侧(绿圈),这同时能反馈到右中的九宫格从而得知右中的2的确切位置。这种方法适用于当有一个九宫格有3个连续的数字时(即满行或者满列),如右下九宫格的 1
3.有时候做完第一步发现没有满足第二步条件的九宫格,则可以直接跳到第三步。第三步:多限制法这其实是最基本也最重要的步骤,在步骤的循环中需要反复的使用。第一步是在同行或者同列的九宫格上排除,这种方法则是通过完全不相干的相同数字排除。如图中的三个8一同限制了右中九宫格的8的位置。第四步:多行排除法这种方法经常有意想不到的作用。这种方法经常有意想不到的作用。使用的条件是找到一个位置分布广泛的数字(如图中的7)然后找到快完成却缺这个数字的一行或者一列(图中粉红框的一行)这时就能用其他的数字7来确定这一行中数字7的位置。基本以上步奏就能做出大部分中等和简单的数独,再加上自己的一些思维就能完成很多。但是我真的碰到过几次以上步骤解决不了的,同时又没头绪,这时我找到了新的杀招。究极步:极限排除法使用条件是找到一个周围数字很多的空格,然后让各种条件去限制它使用条件是找到一个周围数字很多的空格,然后让各种条件去限制它如图红线,他周围的数字表明他不可能是 1 2 3 4 8 6 7 9....所以它绝对是8!不到万不得已,没必要使用这招。That‘s all。
1.前言一直以来很想把经常用到的一些填数独的小技巧进行系统地整理,可是又一直懒得排头。正好这次有闲心,一口气就先写到这儿,至于完善嘛,日后再说了。首先是数独的规则。数独的规则其实很简单,只需要满足两个条件:条件①:每条直线(只包括水平和垂直直线)上只能出现1~9这九个数字。条件②:每个九宫格内只能出现1~9这九个数字。2.误区在这里先指出一个误区。(温馨提示,这个误区仅仅是一个很简单的东西,对于稍微会点数独的同学来说,就可以自行跳过我班门弄斧的这一段)。话不多说,直接上图。如图,红色的数字为那个格子中可能填的数字,我记得当年我上小学的时候,总会很自信地在第三个九宫格中从上到下依次填上4和1,不知道为什么,可能这就是传说中的迷之自信吧。后来渐渐发现,果然是年少无知不懂事,图样图僧破。像这种几个不同格子中可能填入的数字还不同的情况,实际应用起来并不好用,还容易混淆,所以一般不多做考虑。3.感觉很有用的东西3.1
两种情况既然误区的情况没有什么重大意义,那我们就来看看两种比较有用的情况。其实,所有填数独的思想也无非就这两种:情况①:某一确定的格子,填入其中的数有几种可能 (确定格子,不确定数)。如下图所示阴影部分的格子就可以填入1和2这两种情况。情况②:某一确定的数字,一定填入某几个格子。(确定数,不确定格子) 如下图所示,能填上3的格子就有灰色阴影这四个格子。3.2
填数独步骤步骤①:标出所有不确定的可能。利用数独的规则可以确定某些格子中只能填入哪些数,也就像情况①。当然,熟练后这一步通常会省略掉。步骤②:尽可能多地排除数字或格子的可能。运用做数独的一些规律和技巧,可以排除一些并不明显的可能,很多情况下都可以一直排除到确定某个格子中填某个数,这就算是最好的效果。如图所示,如情况②中的例子,如果在第七个九宫格中你突然发现了一个2,这样就可以直接确定阴影部分填1步骤③:试验。最后就是根据最后尽可能多地排除可能后得到的结果,把所有的答案都假设带进去试,如果到后来出现矛盾,则又可以排除一种情况。我承认这样做很无脑,但确实又不失为一个好办法。以上就是我一直以来做数独的思路,看似很简单,但真正填起数独来仍然很难。难就难在步骤②尽可能多地排除可能这一步,因为这一步涉及到有很多的技巧,毕竟数独技巧的精华就在于此。感觉填数独有点像转魔方,技巧就像解魔方时要用到的公式,用了就很简单,不用的话,哼…那你就转到明年去吧。都说到这里了,如果我不继续往下写有哪些技巧,那么前面写的那些也就没有任何意义了,所以,,,4.继续往下写接下来要介绍的所有技巧,都建立在3.1两种情况之上
排除一个格子中数的情况(排除数字)4.1.1
九宫格排除数如图所示,在第一个九宫格中,因为一个格子中1-8的情况都被排除,所以阴影格子中的情况只能是9(如此简单当然不值得一提,同样,它的使用价值也不是很高)4.1.2
利用直线排除如图所示,如果阴影处只看垂直直线,可能的情况为6.7.8.9,但由于水平直线有7.8.9,所以阴影格子只能是6。(当然,这也简单得不值一提)4.1.3
九宫格+直线排除虽然单是直线排除和单是九宫格排除很简单,而且也不大实用,但是直线和九宫格合起来就很实用了。如下图,如果只看九宫格,阴影格子可以填1.2.3.4.5.8.9,但如果再加上横竖两条直线,就只能填9了。4.1.4
九宫格+直线排除之整体代入顾名思义,把整体代入的思想运用起来可以排除更多的数。填稍微难点的数独时,填到中间时段的时候,这个方法也很好用。如图,对于灰色阴影部分来说,九宫格中有3.4,直线上有1.2.6,所以可能的情况有5.7.8.9,但又因为绿色阴影部分必填7.8.9,所以灰色阴影只能填上5。4.2
排除某个数可能出现的格子的个数(排除格子)当拿到一张81个格子的数独时,却只有不到20个已知数字,其余都得通过推理得出。又因为通过格子排除数字不确定性因素太多,所以一开始用排除格子的方法比较好。4.2.1
通过九宫格排除直线中的格子如图所示,因为第一条直线上必须有一个格子填上3,但又不能在第一个九宫格中,也不能在第二个九宫格中,所以只能“屈居”第三个九宫格中,又因为第三个九宫格中第一排已经有了1和2,所以阴影部分只能填上3。这个方法最开始是高中室友告诉我的,非常实用,屡试不爽。可以说是现在填数独用得最多的一个技巧。百度也叫它区块摒除法。另外这个方法还有个变种这样也可以直接确定阴影部分的数字,百度叫这个方法为撑点定位法。4.2.2
通过直线排除九宫格中的格子如图所示,阴影部分只能填3,这个方法是后来我发现的,与上面的方法如出一辙,也挺实用。其实为了对仗工整,此处应该还有4.2.3直线排除直线和4.2.4九宫格排除九宫格,但又因为一个太简单且不实用,另一个的情况并不存在,所以在这里也不再赘述4.3
利用4.2的方法进行4.1的操作如果通过4.1的方法得出一些数字的可能性,不妨假设那个格子就能就是那个数,然后通过4.2的方法得出矛盾,就可以直接排除那个数字。如图,灰色阴影部分可能是3或者5,如果填上3,那么绿色阴影就必须填上3,如果绿色阴影填上3,则黄色阴影部分就没有地方填3,所以阴影部分只能填54.4
利用4.1的方法进行4.2的操作如图,在第一排中有两个3,可以知道灰色阴影和绿色阴影两个地方可以填3,但又因为第六个九宫格中有一个3,所以绿色阴影不能填3,就只有灰色阴影填上3。5.总结与反思看似每一个例题都能确定一个数字,哈哈,孩子果然还是图样图僧破。在真实的情况中并不可能像理想中那么简单。更多的情况是只能排除一两个可能,仍然不能确定哪个数或者哪一个格子。永远做好任何一个方法都只能让你接近成功,并不等于成功的觉悟凡是用到整体思想的地方,都只能确定整体以外的地方的数,并不能确定这个整体内部如何。而且我总感觉整体思想用得越多,到后面需要试验的地方也会变得越多,不要问为什么,都说了只是感觉每当填数独遇到瓶颈,用了很多方法都不能确定一个数的时候,还是果断选择去试吧。其实,这些都是一些简单的技巧,只使用这点方法,要是做一些很难的数独,还是很伤脑筋,网上也有很多高明的方法供大家参考。6.参考文献百度百科
按键精灵。===============================================================7.17更新 优化了第三步算法,删掉了重复的第二步,代码扩充到一千多行,expert模式最新记录7:07===============================================================第一次玩数独,顺手撸出一个按键精灵脚本。本以为两个小时就搞定了,没想到一下花了两天时间才完成,最终代码有700多行,已经可以搞定Microsoft Sudoku大多数expert级别的数独(本来天真地以为可以搞定全部,搜了一下才知道数独的水这么深)。因为不会使用子程序,所以代码有部分重复。不会用矩阵变量,用的都是很低效率的解法,数字的读取用的也都是用最基本的颜色查找和颜色读取。完成一个expert数独平均用时在10分钟左右,还有很大的提升空间。抛砖引玉吧。视频:系统环境:Windows 10 build 14379 Microsoft Sudoku 1.3.0.2按键精灵2014版分辨率设置为,任务栏设置为小图标,最大化数独(不是全屏)代码://第一步:全部标满
MoveTo 496, 672
//进入note模式
LeftClick 1
For number = 0 To 8
MoveTo number * 59 + 596, 671
//选择最下面的数字
LeftClick 1
//全部判断点击
For pointr=0 to 8
//一行判断点击
For pointc=0 to 8
pointx = pointc * 58 + 572
pointy= pointr*58+141
GetColor = GetPixelColor(pointx, pointy)
If getcolor = "FFFFFF" Then
MoveTo pointx, pointy
LeftClick 1
//第二步:取消标记
Do While number & 9
MoveTo number * 59 + 596, 671
LeftClick 1
For pointc=0 to 8
pointx = pointc * 58 + 572
pointy= pointr*58+141
GetColor = GetPixelColor(pointx, pointy)
intY = 112
FindColor 565,intY,1089,635,"93691E",intX,intY
If intX & 0 And intY & 0 Then
//一行判断点击
For pointc=0 to 8
pointx = pointc * 58 + 572
pointy= intY+29
GetColor = GetPixelColor(pointx, pointy)
If getcolor = "FBE2E4" Then
MoveTo pointx, pointy
LeftClick 1
//一列判断点击
For pointr=0 to 8
pointx = intX+29
pointy= pointr*58+ 137
GetColor = GetPixelColor(pointx, pointy)
If getcolor = "FBE2E4" Then
MoveTo pointx, pointy
LeftClick 1
//九宫格点击
If intX + 29 & 565 and intX + 29 & 565 + 58 or intX + 29 & 565 + 58 * 3 and intX + 29 & 565 + 58 * 4 or intX + 29 & 565 + 58 * 6 and intX + 29 & 565 + 58 * 7 Then
If intY + 29 & 112 and intY + 29 & 112 + 58 or intY + 29 & 112 + 58 * 3 and intY + 29 & 112 + 58 * 4 or intY + 29 & 112 + 58 * 6 and intY + 29 & 112 + 58 * 7 Then
//一列一行
//一列二行
If intY + 29 & 112+58 and intY + 29 & 112 + 58*2 or intY + 29 & 112 + 58 * 4 and intY + 29 & 112 + 58 * 5 or intY + 29 & 112 + 58 * 7 and intY + 29 & 112 + 58 * 8 Then
//一列三行
If intY + 29 & 112+58*2 and intY + 29 & 112 + 58*3 or intY + 29 & 112 + 58 * 5 and intY + 29 & 112 + 58 * 6 or intY + 29 & 112 + 58 * 8 and intY + 29 & 112 + 58 * 9 Then
If intX + 29 & 565+58 and intX + 29 & 565 + 58*2 or intX + 29 & 565 + 58 * 4 and intX + 29 & 565 + 58 * 5 or intX + 29 & 565 + 58 * 7 and intX + 29 & 565 + 58 * 8 Then
If intY + 29 & 112 and intY + 29 & 112 + 58 or intY + 29 & 112 + 58 * 3 and intY + 29 & 112 + 58 * 4 or intY + 29 & 112 + 58 * 6 and intY + 29 & 112 + 58 * 7 Then
//二列一行
//二列二行
If intY + 29 & 112+58 and intY + 29 & 112 + 58*2 or intY + 29 & 112 + 58 * 4 and intY + 29 & 112 + 58 * 5 or intY + 29 & 112 + 58 * 7 and intY + 29 & 112 + 58 * 8 Then
//二列三行
If intY + 29 & 112+58*2 and intY + 29 & 112 + 58*3 or intY + 29 & 112 + 58 * 5 and intY + 29 & 112 + 58 * 6 or intY + 29 & 112 + 58 * 8 and intY + 29 & 112 + 58 * 9 Then
If intX + 29 & 565+58*2 and intX + 29 & 565 + 58*3 or intX + 29 & 565 + 58 * 5 and intX + 29 & 565 + 58 * 6 or intX + 29 & 565 + 58 * 8 and intX + 29 & 565 + 58 * 9 Then
If intY + 29 & 112 and intY + 29 & 112 + 58 or intY + 29 & 112 + 58 * 3 and intY + 29 & 112 + 58 * 4 or intY + 29 & 112 + 58 * 6 and intY + 29 & 112 + 58 * 7 Then
//三列一行
//三列二行
If intY + 29 & 112+58 and intY + 29 & 112 + 58*2 or intY + 29 & 112 + 58 * 4 and intY + 29 & 112 + 58 * 5 or intY + 29 & 112 + 58 * 7 and intY + 29 & 112 + 58 * 8 Then
//三列三行
If intY + 29 & 112+58*2 and intY + 29 & 112 + 58*3 or intY + 29 & 112 + 58 * 5 and intY + 29 & 112 + 58 * 6 or intY + 29 & 112 + 58 * 8 and intY + 29 & 112 + 58 * 9 Then
GetColor = GetPixelColor(intX+58*x1, intY+58*y1+29)
If getcolor = "FBE2E4" Then
MoveTo intX+58*x1, intY+58*y1+29
LeftClick 1
GetColor = GetPixelColor(intX+58*x2, intY+58*y1+29)
If getcolor = "FBE2E4" Then
MoveTo intX+58*x2, intY+58*y1+29
LeftClick 1
GetColor = GetPixelColor(intX+58*x1, intY+58*y2+29)
If getcolor = "FBE2E4" Then
MoveTo intX+58*x1, intY+58*y2+29
LeftClick 1
GetColor = GetPixelColor(intX+58*x2, intY+58*y2+29)
If getcolor = "FBE2E4" Then
MoveTo intX+58*x2, intY+58*y2+29
LeftClick 1
Goto 找不到就跳出
intY = intY + 55
Rem 找不到就跳出
number=number+1
MoveTo 496, 672 //解除note模式
LeftClick 1
Rem 第三步
//第三步:填充每行列缺少的个数为一的数字
Do While number & 9
MoveTo number * 59 + 596, 671
LeftClick 1
Rem 从这个数字开头开始
For pointr = 0 To 8
MoveTo 550,pointr * 58 + 141
//展示进度
colornum=0
For pointc=0 to 8
pointx = pointc * 58 + 572
pointy= pointr*58+141
GetColor = GetPixelColor(pointx, pointy)
If getcolor = "FBE2E4" Then
colornum=colornum+1
goodcolor=pointc
If colornum = 1 Then
FindColor 565,pointr * 58 + 141,089,pointr * 58 + 141,"93691E",intX3,intY3
If intX3 & 0 And intY3 & 0 Then
MoveTo goodcolor * 58 + 572+29, pointr * 58 + 141
//填充数字
LeftClick 1
MoveTo 496, 672
LeftClick 1
intX2 = goodcolor * 58 + 572
pointr * 58 + 141-29
//重复第二步
//--------------------------------
intX = intX2 + 5
intY = intY2
//一行判断点击
For pointc=0 to 8
pointx = pointc * 58 + 572
pointy= intY+29
GetColor = GetPixelColor(pointx, pointy)
If getcolor = "FBE2E4" Then
MoveTo pointx, pointy
LeftClick 1
//一列判断点击
For pointr=0 to 8
pointx = intX
pointy= pointr*58+ 137
GetColor = GetPixelColor(pointx, pointy)
If getcolor = "FBE2E4" Then
MoveTo pointx, pointy
LeftClick 1
//九宫格点击
If intX + 29 & 565 and intX + 29 & 565 + 58 or intX + 29 & 565 + 58 * 3 and intX + 29 & 565 + 58 * 4 or intX + 29 & 565 + 58 * 6 and intX + 29 & 565 + 58 * 7 Then
If intY + 29 & 112 and intY + 29 & 112 + 58 or intY + 29 & 112 + 58 * 3 and intY + 29 & 112 + 58 * 4 or intY + 29 & 112 + 58 * 6 and intY + 29 & 112 + 58 * 7 Then
//一列一行
//一列二行
If intY + 29 & 112+58 and intY + 29 & 112 + 58*2 or intY + 29 & 112 + 58 * 4 and intY + 29 & 112 + 58 * 5 or intY + 29 & 112 + 58 * 7 and intY + 29 & 112 + 58 * 8 Then
//一列三行
If intY + 29 & 112+58*2 and intY + 29 & 112 + 58*3 or intY + 29 & 112 + 58 * 5 and intY + 29 & 112 + 58 * 6 or intY + 29 & 112 + 58 * 8 and intY + 29 & 112 + 58 * 9 Then
If intX + 29 & 565+58 and intX + 29 & 565 + 58*2 or intX + 29 & 565 + 58 * 4 and intX + 29 & 565 + 58 * 5 or intX + 29 & 565 + 58 * 7 and intX + 29 & 565 + 58 * 8 Then
If intY + 29 & 112 and intY + 29 & 112 + 58 or intY + 29 & 112 + 58 * 3 and intY + 29 & 112 + 58 * 4 or intY + 29 & 112 + 58 * 6 and intY + 29 & 112 + 58 * 7 Then
//二列一行
//二列二行
If intY + 29 & 112+58 and intY + 29 & 112 + 58*2 or intY + 29 & 112 + 58 * 4 and intY + 29 & 112 + 58 * 5 or intY + 29 & 112 + 58 * 7 and intY + 29 & 112 + 58 * 8 Then
//二列三行
If intY + 29 & 112+58*2 and intY + 29 & 112 + 58*3 or intY + 29 & 112 + 58 * 5 and intY + 29 & 112 + 58 * 6 or intY + 29 & 112 + 58 * 8 and intY + 29 & 112 + 58 * 9 Then
If intX + 29 & 565+58*2 and intX + 29 & 565 + 58*3 or intX + 29 & 565 + 58 * 5 and intX + 29 & 565 + 58 * 6 or intX + 29 & 565 + 58 * 8 and intX + 29 & 565 + 58 * 9 Then
If intY + 29 & 112 and intY + 29 & 112 + 58 or intY + 29 & 112 + 58 * 3 and intY + 29 & 112 + 58 * 4 or intY + 29 & 112 + 58 * 6 and intY + 29 & 112 + 58 * 7 Then
//三列一行
//三列二行
If intY + 29 & 112+58 and intY + 29 & 112 + 58*2 or intY + 29 & 112 + 58 * 4 and intY + 29 & 112 + 58 * 5 or intY + 29 & 112 + 58 * 7 and intY + 29 & 112 + 58 * 8 Then
//三列三行
If intY + 29 & 112+58*2 and intY + 29 & 112 + 58*3 or intY + 29 & 112 + 58 * 5 and intY + 29 & 112 + 58 * 6 or intY + 29 & 112 + 58 * 8 and intY + 29 & 112 + 58 * 9 Then
GetColor = GetPixelColor(intX + 58 * x1, intY + 58 * y1 + 29)
If getcolor = "FBE2E4" Then
MoveTo intX+58*x1, intY+58*y1+29
LeftClick 1
GetColor = GetPixelColor(intX + 58 * x2, intY + 58 * y1 + 29)
If getcolor = "FBE2E4" Then
MoveTo intX+58*x2, intY+58*y1+29
LeftClick 1
GetColor = GetPixelColor(intX + 58 * x1, intY + 58 * y2 + 29)
If getcolor = "FBE2E4" Then
MoveTo intX+58*x1, intY+58*y2+29
LeftClick 1
GetColor = GetPixelColor(intX + 58 * x2, intY + 58 * y2 + 29)
If getcolor = "FBE2E4" Then
MoveTo intX+58*x2, intY+58*y2+29
LeftClick 1
//重复结束---------------------------------------------
MoveTo 496, 672 //解除note模式
LeftClick 1
Goto 从这个数字开头开始
For pointc = 0 To 8
MoveTo pointc * 58 + 572+29 ,90 //展示进度
colornum=0
For pointr=0 to 8
pointx = pointc * 58 + 572
pointy= pointr*58+141
GetColor = GetPixelColor(pointx, pointy)
If getcolor = "FBE2E4" Then
colornum=colornum+1
goodcolor=pointr
If colornum = 1 Then
FindColor pointc*58+572,112,pointc*58+572,635,"93691E",intX3,intY3
If intX3 & 0 And intY3 & 0 Then
MoveTo pointc * 58 + 572+29, goodcolor * 58 + 141
//填充数字
LeftClick 1
MoveTo 496, 672
LeftClick 1
intX2 = pointc * 58 + 572
intY2 =goodcolor * 58 + 141-29
//重复第二步
//--------------------------------
intX = intX2 + 5
intY = intY2
//一行判断点击
For pointc=0 to 8
pointx = pointc * 58 + 572
pointy= intY+29
GetColor = GetPixelColor(pointx, pointy)
If getcolor = "FBE2E4" Then
MoveTo pointx, pointy
LeftClick 1
//一列判断点击
For pointr=0 to 8
pointx = intX
pointy= pointr*58+ 137
GetColor = GetPixelColor(pointx, pointy)
If getcolor = "FBE2E4" Then
MoveTo pointx, pointy
LeftClick 1
//九宫格点击
If intX + 29 & 565 and intX + 29 & 565 + 58 or intX + 29 & 565 + 58 * 3 and intX + 29 & 565 + 58 * 4 or intX + 29 & 565 + 58 * 6 and intX + 29 & 565 + 58 * 7 Then
If intY + 29 & 112 and intY + 29 & 112 + 58 or intY + 29 & 112 + 58 * 3 and intY + 29 & 112 + 58 * 4 or intY + 29 & 112 + 58 * 6 and intY + 29 & 112 + 58 * 7 Then
//一列一行
//一列二行
If intY + 29 & 112+58 and intY + 29 & 112 + 58*2 or intY + 29 & 112 + 58 * 4 and intY + 29 & 112 + 58 * 5 or intY + 29 & 112 + 58 * 7 and intY + 29 & 112 + 58 * 8 Then
//一列三行
If intY + 29 & 112+58*2 and intY + 29 & 112 + 58*3 or intY + 29 & 112 + 58 * 5 and intY + 29 & 112 + 58 * 6 or intY + 29 & 112 + 58 * 8 and intY + 29 & 112 + 58 * 9 Then
If intX + 29 & 565+58 and intX + 29 & 565 + 58*2 or intX + 29 & 565 + 58 * 4 and intX + 29 & 565 + 58 * 5 or intX + 29 & 565 + 58 * 7 and intX + 29 & 565 + 58 * 8 Then
If intY + 29 & 112 and intY + 29 & 112 + 58 or intY + 29 & 112 + 58 * 3 and intY + 29 & 112 + 58 * 4 or intY + 29 & 112 + 58 * 6 and intY + 29 & 112 + 58 * 7 Then
//二列一行
//二列二行
If intY + 29 & 112+58 and intY + 29 & 112 + 58*2 or intY + 29 & 112 + 58 * 4 and intY + 29 & 112 + 58 * 5 or intY + 29 & 112 + 58 * 7 and intY + 29 & 112 + 58 * 8 Then
//二列三行
If intY + 29 & 112+58*2 and intY + 29 & 112 + 58*3 or intY + 29 & 112 + 58 * 5 and intY + 29 & 112 + 58 * 6 or intY + 29 & 112 + 58 * 8 and intY + 29 & 112 + 58 * 9 Then
If intX + 29 & 565+58*2 and intX + 29 & 565 + 58*3 or intX + 29 & 565 + 58 * 5 and intX + 29 & 565 + 58 * 6 or intX + 29 & 565 + 58 * 8 and intX + 29 & 565 + 58 * 9 Then
If intY + 29 & 112 and intY + 29 & 112 + 58 or intY + 29 & 112 + 58 * 3 and intY + 29 & 112 + 58 * 4 or intY + 29 & 112 + 58 * 6 and intY + 29 & 112 + 58 * 7 Then
//三列一行
//三列二行
If intY + 29 & 112+58 and intY + 29 & 112 + 58*2 or intY + 29 & 112 + 58 * 4 and intY + 29 & 112 + 58 * 5 or intY + 29 & 112 + 58 * 7 and intY + 29 & 112 + 58 * 8 Then
//三列三行
If intY + 29 & 112+58*2 and intY + 29 & 112 + 58*3 or intY + 29 & 112 + 58 * 5 and intY + 29 & 112 + 58 * 6 or intY + 29 & 112 + 58 * 8 and intY + 29 & 112 + 58 * 9 Then
GetColor = GetPixelColor(intX + 58 * x1, intY + 58 * y1 + 29)
If getcolor = "FBE2E4" Then
MoveTo intX+58*x1, intY+58*y1+29
LeftClick 1
GetColor = GetPixelColor(intX + 58 * x2, intY + 58 * y1 + 29)
If getcolor = "FBE2E4" Then
MoveTo intX+58*x2, intY+58*y1+29
LeftClick 1
GetColor = GetPixelColor(intX + 58 * x1, intY + 58 * y2 + 29)
If getcolor = "FBE2E4" Then
MoveTo intX+58*x1, intY+58*y2+29
LeftClick 1
GetColor = GetPixelColor(intX + 58 * x2, intY + 58 * y2 + 29)
If getcolor = "FBE2E4" Then
MoveTo intX+58*x2, intY+58*y2+29
LeftClick 1
//重复结束---------------------------------------------
MoveTo 496, 672 //解除note模式
LeftClick 1
Goto 从这个数字开头开始
//每九宫格
For y2 = 1 To 3
For x2 = 1 To 3
MoveTo 652 + 58 * 3 * (x2 - 1), 199 + 58 * 3 * (y2 - 1)
colornum = 0
For y = 1 To 3
For x = 1 To 3
GetColor = GetPixelColor(58 * x + 58 * 3 * (x2 - 1) + 514, 58 * y + 83 + 58 * 3 * (y2 - 1))
If getcolor = "FBE2E4" Then
colornum = colornum + 1
goodcolorx = x
goodcolory = y
If colornum = 1 Then
FindColor 594+ 58 * 3 * (x2 - 1), 141+ 58 * 3 * (y2 - 1), 710+ 58 * 3 * (x2 - 1), 257+ 58 * 3 * (y2 - 1), "93691E", intX, intY
If intX & 0 And intY & 0 Then
MoveTo 58 * goodcolorx + 514+ 58 * 3 * (x2 - 1), 58 * goodcolory + 83+ 58 * 3 * (y2 - 1)
LeftClick 1
MoveTo 496, 672
LeftClick 1
intX2 = 58 * goodcolorx + 514+ 58 * 3 * (x2 - 1)-29
intY2 = 58 * goodcolory + 83+ 58 * 3 * (y2 - 1)-29
//重复第二步
//--------------------------------
intX = intX2 + 5
intY = intY2
//一行判断点击
For pointc=0 to 8
pointx = pointc * 58 + 572
pointy= intY+29
GetColor = GetPixelColor(pointx, pointy)
If getcolor = "FBE2E4" Then
MoveTo pointx, pointy
LeftClick 1
//一列判断点击
For pointr=0 to 8
pointx = intX
pointy= pointr*58+ 137
GetColor = GetPixelColor(pointx, pointy)
If getcolor = "FBE2E4" Then
MoveTo pointx, pointy
LeftClick 1
//九宫格点击
If intX + 29 & 565 and intX + 29 & 565 + 58 or intX + 29 & 565 + 58 * 3 and intX + 29 & 565 + 58 * 4 or intX + 29 & 565 + 58 * 6 and intX + 29 & 565 + 58 * 7 Then
If intY + 29 & 112 and intY + 29 & 112 + 58 or intY + 29 & 112 + 58 * 3 and intY + 29 & 112 + 58 * 4 or intY + 29 & 112 + 58 * 6 and intY + 29 & 112 + 58 * 7 Then
//一列一行
//一列二行
If intY + 29 & 112+58 and intY + 29 & 112 + 58*2 or intY + 29 & 112 + 58 * 4 and intY + 29 & 112 + 58 * 5 or intY + 29 & 112 + 58 * 7 and intY + 29 & 112 + 58 * 8 Then
//一列三行
If intY + 29 & 112+58*2 and intY + 29 & 112 + 58*3 or intY + 29 & 112 + 58 * 5 and intY + 29 & 112 + 58 * 6 or intY + 29 & 112 + 58 * 8 and intY + 29 & 112 + 58 * 9 Then
If intX + 29 & 565+58 and intX + 29 & 565 + 58*2 or intX + 29 & 565 + 58 * 4 and intX + 29 & 565 + 58 * 5 or intX + 29 & 565 + 58 * 7 and intX + 29 & 565 + 58 * 8 Then
If intY + 29 & 112 and intY + 29 & 112 + 58 or intY + 29 & 112 + 58 * 3 and intY + 29 & 112 + 58 * 4 or intY + 29 & 112 + 58 * 6 and intY + 29 & 112 + 58 * 7 Then
//二列一行
//二列二行
If intY + 29 & 112+58 and intY + 29 & 112 + 58*2 or intY + 29 & 112 + 58 * 4 and intY + 29 & 112 + 58 * 5 or intY + 29 & 112 + 58 * 7 and intY + 29 & 112 + 58 * 8 Then
//二列三行
If intY + 29 & 112+58*2 and intY + 29 & 112 + 58*3 or intY + 29 & 112 + 58 * 5 and intY + 29 & 112 + 58 * 6 or intY + 29 & 112 + 58 * 8 and intY + 29 & 112 + 58 * 9 Then
If intX + 29 & 565+58*2 and intX + 29 & 565 + 58*3 or intX + 29 & 565 + 58 * 5 and intX + 29 & 565 + 58 * 6 or intX + 29 & 565 + 58 * 8 and intX + 29 & 565 + 58 * 9 Then
If intY + 29 & 112 and intY + 29 & 112 + 58 or intY + 29 & 112 + 58 * 3 and intY + 29 & 112 + 58 * 4 or intY + 29 & 112 + 58 * 6 and intY + 29 & 112 + 58 * 7 Then
//三列一行
//三列二行
If intY + 29 & 112+58 and intY + 29 & 112 + 58*2 or intY + 29 & 112 + 58 * 4 and intY + 29 & 112 + 58 * 5 or intY + 29 & 112 + 58 * 7 and intY + 29 & 112 + 58 * 8 Then
//三列三行
If intY + 29 & 112+58*2 and intY + 29 & 112 + 58*3 or intY + 29 & 112 + 58 * 5 and intY + 29 & 112 + 58 * 6 or intY + 29 & 112 + 58 * 8 and intY + 29 & 112 + 58 * 9 Then
GetColor = GetPixelColor(intX + 58 * x1, intY + 58 * y1 + 29)
If getcolor = "FBE2E4" Then
MoveTo intX+58*x1, intY+58*y1+29
LeftClick 1
GetColor = GetPixelColor(intX + 58 * x2, intY + 58 * y1 + 29)
If getcolor = "FBE2E4" Then
MoveTo intX+58*x2, intY+58*y1+29
LeftClick 1
GetColor = GetPixelColor(intX + 58 * x1, intY + 58 * y2 + 29)
If getcolor = "FBE2E4" Then
MoveTo intX+58*x1, intY+58*y2+29
LeftClick 1
GetColor = GetPixelColor(intX + 58 * x2, intY + 58 * y2 + 29)
If getcolor = "FBE2E4" Then
MoveTo intX+58*x2, intY+58*y2+29
LeftClick 1
//重复结束---------------------------------------------
MoveTo 496, 672 //解除note模式
LeftClick 1
Goto 从这个数字开头开始
number = number + 1
//第四步:放数字
MoveTo 1173, 369
//点击空白处消除数字选中
LeftClick 1
Rem 重新开始
MoveTo 1173, 369
//点击空白处消除数字选中
LeftClick 1
//全行判断
For pointr = 0 To 8
//一行判断
For pointc = 0 To 8
MoveTo 1173, 369
//点击空白处消除数字选中
LeftClick 1
pointx = pointc * 58 + 572
pointy= pointr*58+141
GetColor = GetPixelColor(pointx, pointy)
If getcolor = "FFFFFF" Then
intX2 = pointx-2
//兼容后面的代码
intY2 = pointy-29
colornum = 0
For number=0 to 8
MoveTo number * 59 + 596, 671
LeftClick 1
getcolor = GetPixelColor(intX2+2, intY2+29)
//判断该格颜色
If getcolor = "FBE2E4" Then
colornum = colornum + 1
goodcolor=number
colornum = 1
number = goodcolor
MoveTo 1173, 369
//点击空白处消除数字选中
LeftClick 1
MoveTo number * 59 + 596, 671
LeftClick 1
MoveTo intX2 + 5, intY2 + 29
LeftClick 1
MoveTo 496, 672
LeftClick 1
//重复第二步
//--------------------------------
GetColor = GetPixelColor(pointx, pointy)
intX = intX2 + 5
intY = intY2
//一行判断点击
For pointc=0 to 8
pointx = pointc * 58 + 572
pointy= intY+29
GetColor = GetPixelColor(pointx, pointy)
If getcolor = "FBE2E4" Then
MoveTo pointx, pointy
LeftClick 1
//一列判断点击
For pointr=0 to 8
pointx = intX+29
pointy= pointr*58+ 137
GetColor = GetPixelColor(pointx, pointy)
If getcolor = "FBE2E4" Then
MoveTo pointx, pointy
LeftClick 1
//九宫格点击
If intX + 29 & 565 and intX + 29 & 565 + 58 or intX + 29 & 565 + 58 * 3 and intX + 29 & 565 + 58 * 4 or intX + 29 & 565 + 58 * 6 and intX + 29 & 565 + 58 * 7 Then
If intY + 29 & 112 and intY + 29 & 112 + 58 or intY + 29 & 112 + 58 * 3 and intY + 29 & 112 + 58 * 4 or intY + 29 & 112 + 58 * 6 and intY + 29 & 112 + 58 * 7 Then
//一列一行
//一列二行
If intY + 29 & 112+58 and intY + 29 & 112 + 58*2 or intY + 29 & 112 + 58 * 4 and intY + 29 & 112 + 58 * 5 or intY + 29 & 112 + 58 * 7 and intY + 29 & 112 + 58 * 8 Then
//一列三行
If intY + 29 & 112+58*2 and intY + 29 & 112 + 58*3 or intY + 29 & 112 + 58 * 5 and intY + 29 & 112 + 58 * 6 or intY + 29 & 112 + 58 * 8 and intY + 29 & 112 + 58 * 9 Then
If intX + 29 & 565+58 and intX + 29 & 565 + 58*2 or intX + 29 & 565 + 58 * 4 and intX + 29 & 565 + 58 * 5 or intX + 29 & 565 + 58 * 7 and intX + 29 & 565 + 58 * 8 Then
If intY + 29 & 112 and intY + 29 & 112 + 58 or intY + 29 & 112 + 58 * 3 and intY + 29 & 112 + 58 * 4 or intY + 29 & 112 + 58 * 6 and intY + 29 & 112 + 58 * 7 Then
//二列一行
//二列二行
If intY + 29 & 112+58 and intY + 29 & 112 + 58*2 or intY + 29 & 112 + 58 * 4 and intY + 29 & 112 + 58 * 5 or intY + 29 & 112 + 58 * 7 and intY + 29 & 112 + 58 * 8 Then
//二列三行
If intY + 29 & 112+58*2 and intY + 29 & 112 + 58*3 or intY + 29 & 112 + 58 * 5 and intY + 29 & 112 + 58 * 6 or intY + 29 & 112 + 58 * 8 and intY + 29 & 112 + 58 * 9 Then
If intX + 29 & 565+58*2 and intX + 29 & 565 + 58*3 or intX + 29 & 565 + 58 * 5 and intX + 29 & 565 + 58 * 6 or intX + 29 & 565 + 58 * 8 and intX + 29 & 565 + 58 * 9 Then
If intY + 29 & 112 and intY + 29 & 112 + 58 or intY + 29 & 112 + 58 * 3 and intY + 29 & 112 + 58 * 4 or intY + 29 & 112 + 58 * 6 and intY + 29 & 112 + 58 * 7 Then
//三列一行
//三列二行
If intY + 29 & 112+58 and intY + 29 & 112 + 58*2 or intY + 29 & 112 + 58 * 4 and intY + 29 & 112 + 58 * 5 or intY + 29 & 112 + 58 * 7 and intY + 29 & 112 + 58 * 8 Then
//三列三行
If intY + 29 & 112+58*2 and intY + 29 & 112 + 58*3 or intY + 29 & 112 + 58 * 5 and intY + 29 & 112 + 58 * 6 or intY + 29 & 112 + 58 * 8 and intY + 29 & 112 + 58 * 9 Then
GetColor = GetPixelColor(intX+58*x1, intY+58*y1+29)
If getcolor = "FBE2E4" Then
MoveTo intX+58*x1, intY+58*y1+29
LeftClick 1
GetColor = GetPixelColor(intX+58*x2, intY+58*y1+29)
If getcolor = "FBE2E4" Then
MoveTo intX+58*x2, intY+58*y1+29
LeftClick 1
GetColor = GetPixelColor(intX+58*x1, intY+58*y2+29)
If getcolor = "FBE2E4" Then
MoveTo intX+58*x1, intY+58*y2+29
LeftClick 1
GetColor = GetPixelColor(intX+58*x2, intY+58*y2+29)
If getcolor = "FBE2E4" Then
MoveTo intX+58*x2, intY+58*y2+29
LeftClick 1
//重复结束---------------------------------------------
MoveTo 496, 672 //解除note模式
LeftClick 1
Goto 重新开始
Goto 第三步
推荐一款数独应用。英文名叫sudoku 10000 plus。下面是国内的下载链接,或者如果有条件也可以上google play搜下试了差不多十来个数独应用之后就留下了这一款,因为一是题目多,难度分级多,适合逐步进阶。二是里面的提示功能相当强劲,可以详细的告诉你这个解法的名字,原理,例子。循序渐进,非常有助于提高解题水平。关键是结合你正在做的例子,记得非常牢固。推荐从低一点的等级开始试起,·如果连做三道都能不看提示轻松解题的话,就提升到下一个等级。直到某个等级发现解题过程中需要看一到两次提示,说明出现了你尚未掌握的解题方法,继续做,等这个等级的题对你也没难度的时候,恭喜你,你肯定掌握了新的解题方法,进军下一等级吧。
终于决定献出知乎上的第一次了~
数独这项游戏由于曾被各类杂志拿来作为读者互动的项目,具有很高的普及性。几乎每个人都了解数独都基本规则。但很多人由于只是单纯但把规则当作规则,忽视了其作为一切技巧的原则的重要性。本文的思路是依据数独唯一也是最基本的规则推导出若干条推论,运用这些推论去拆解数独,我将举具体例子来说明这些用法。本文里的大部分推论其实相信很多人都用过,我在这里相当于做一个抽象总结的工作,便于在理论上有一定的说服力。文笔笨拙,若行文枯燥,还望海涵。欢迎一切讨论和指错。-----------------第一次分割---------------------
让我们从最基本的开始:
数独的规则:在由9个3x3的小九格组成的3x3的大九格里填上9次1,2,3,4,5,6,7,8,9,使得每个小九格中每个数字各出现一次,每个大九格中的每行和每列上的9个格子中每个数字各出现一次。该规则是如此的重要以至于我们所有的玩法都是建立在这规则上面的。该规则就好比几何中的基本公设。因此让我们来细细研究一下:
首先注意到到是这1-9虽然是数字,但不牵涉到计算。因此这些数字体现到是它们到差别性,换句话说,如果我们用abcdefghi来代替1-9是可以的,我们甚至可以用颜色来代替它们。因为该规则告诉我们的就是小九格中每个格子都不一样,大九格中每行(以下简称“行”)或每列(以下简称“列”)上都九个格子都不一样。由该规则我们将得出两条推论:推论1、任何一个小九格中或者大九格中每行和每列上的格子有且只有1-9这九个数字。(完备性)
推论2、任何一个小格子上的数字和与其在同一小九格中或同一行或同一列上的数字全不一样。(唯一性)
本文所有证明将放在最后,在这里贴图说明:以左上角的1为例,其所在的小九格中没有其他的1,且1-9都用满了,对于其所在的行或者列上的情况一样适用。以左上角的1为例,其所在的小九格中没有其他的1,且1-9都用满了,对于其所在的行或者列上的情况一样适用。由以上两条推论我们可以得出第三条推论:推论3、对于在同一竖线(或横线)上的三个小九格,每个数字将分别在这些小九格中出现各一次,且同一数字不出现在同一列(或行)上。(分配性)以后证明,目前依旧举以上图说明:以最左边的三个小九格为例:当1出现在了第一个小九格的最左边时,1便只能出现在第二个小九格的第二列或第三列。那么在第三个小九格中,1只能出现在之前没有出现过1 的那一列。在拥有以上推论后,我们便可以解出大部分中等难度下的数独。事实上许多人也正是依靠这些推论和部分自己下意识的衍生技巧解数独的(但许多人只是没有刻意去在乎)。而我们也将以这3条推论和基本规则为最初手段开始,通过解具体的一套题,再引出其他的推论。&我将先写到这里并且把这个回答贴出来,目的只是测试一下上传到图片能否显示&&最终完整的文章也许还会对这些已经贴出对答案进行修改,忘原谅&
自邀,看了目前赞最多的答案,觉得只能破解中等难度的数独,而且方法没有体系,小白难以操作。个人推崇候选删减流(不要问我有没有这个流派,我随口一说咯)步骤如下:1.当你拿一个中等难度以上的数独时,先把所有格子的所有候选数填出来,这个相比之下委实谈不上麻烦,这就是候选咯。2.接着便是删减,方法如下。i)唯一数法(基础知识)如果我们发现某个格子中只有一个可用候选数,那么这个格子必然是这个数字,这就是唯一数法如下面例子,H5格子中只有唯一候选数3ii)隐含唯一数法(仔细看,这个不一样)ii)隐含唯一数法(仔细看,这个不一样)如果我们发现某一行某一列或某个九宫有一个候选数只出现在一个格子里面,那么这个格子必然是这个数字,这就是隐含唯一数法,如下面例子,第3列候选数4只出现在格子I3中iii)数对法如果我们发现某一行某一列或某个九宫有两个格子只使用了两个候选数,那么这两个格子必然正好是这两个数字,那么在这个单元(行,列,或九宫)中,其它格子不会出现这两个候选数,这就是数对法,如下面例子,第一列中B1和G1的候选数都是7,8;那么D1,H1中的候选数7,8可以删除。iv)三链数法如果我们发现某一行某一列或某个九宫有三个格子只使用了三个候选数,那么这三个格子必然正好是这三个数字,那么在这个单元(行,列,或九宫)中,其它格子不会出现这三个候选数,这就是三链数法,如下面例子,最下面中间的九宫中格子H4,H5,I5三个格子都只使用候选数2,8,6;所以G4,G6,I6中出现的8,6都可以删除v)四链数法(同理上个,没必要看,可跳过)如果我们发现某一行某一列或某个九宫有四个格子只使用了四个候选数,那么这四个格子必然正好是这四个数字,那么在这个单元(行,列,或九宫)中,其它格子不会出现这四个候选数,这就是四链数法;如下面例子中上面中间的九宫中四个格子A5,B5,C4,C5都只使用了数字1,2,3,4;所以另外4个格子A4,A6,B4,C6中出现的数字1,2,3,4可以删除当然还有一些其他的删减方法,不过有些计算量,一时半刻也说不清,等我能够简化表达时再更咯。
已有帐号?
无法登录?
社交帐号登录}

我要回帖

更多关于 数独解法全知道 的文章

更多推荐

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

点击添加站长微信