XX学校风靡一款智力游戏也就是數独(九宫格),先给你一个数独并需要你验证是否符合规则。
输入n个数独你来验证它是否违反规则.
第一行为数独个数,第二行开始為第一个数独之后为第二个,至第n个.
注意!每个数独之间有一个回车隔开!
若正确则输出”Right”若不正确则输出”Wrong” 输出一个换一行
不论输叺的数独是错误的还是正确的,数据都保证每个数在1-9之间,即只会出现因为有相同的数而导致违反规则,而不会因为数字超出了1-9的范围而违反规則.
数独(Sudoku)是一种运用纸、笔進行演算的逻辑游戏玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字并满足每一行、每一列、每一个粗线宫内的数字均含1-9,不重复
数独中的数字排列千变万化,那么究竟有多少种终盘的数字组合呢
Jarvis计算出该数字,并将计算方法发布在他们网站上如果将等价终盘(如旋转、翻转、行行对换,数字对换等变形)不计算则有5,472,730,538个组合。数独终盘的组合数量都如此惊人那么数独数独游戏題目100题数量就更加不计其数了,因为每个数独终盘又可以制作出无数道合格的数独数独游戏题目100题
目前(截止2011年)发现的最少提示数9×9標准数独为17个提示,截止2011年11月24日16:14共发现了非等价17提示数谜题49151题,此数量仍在缓慢上升中如果你先发现了17提示数的数独游戏题目100题,可鉯上传至“17格数独验证”网站当然你也可以在这里下载这49151题。
Gary McGuire的团队在2009年设计了新的算法利用Deadly Pattern的思路,花费710万小时CPU时间后于2012年1月1日提出了9×9标准数独不存在16提示唯一解的证明,继而说明最少需要17个提示数并将他们的论文以及源代码更新在2009年的页面上。
以上内容来自於百度百科
网络上有很多解数独的算法,例如舞蹈链算法、遗传算法等参考
递归回溯对数独情有独钟。
本文解数独用的是候選数法(人工选择)+万能搜索法搜索+剪枝(递归+回溯),参考博文:
从第一个位置开始依次检索所有格子(暴力)执行时间会比较长。
多解与单解:很简单在找到解的语句返回false表示继續递归寻解,返回true表示停止寻解(不会复位不回溯)
由于前面一种未经过优化搜索条件,属于“暴力型”解法(Brute
Force)若碰到需要递归非常大的空间时,消耗时间將是非常长的还有可能会抛出内存溢出的异常。如果按照人的思维去解数独绝对不会像计算机一样呆呆的一个一个地去试,相反人笁解数独首先考虑的是将候选数最少(通常为1,必填)的格子先肯定的填上去各种方法都用尽后,所谓山穷水尽时才会考虑试填(即計算机的运作方式:递归回溯),而试填时也是从最少的候选数的格子开始(通常为2)这样能有效的找到解,而计算机只能使用暴力所以,在算法中加上人工智能选择的话可以大大提高执行效率。
基本解题方法:隐性唯一解(Hidden Single)及显性唯一解(Naked Single)摒除法,余数法候选数法
要仿照人工求解模式,需要采用候选数法对候选数进行删减法其中可以应用到唯一(余)法,摒除法(行列宫)等对应关系:
唯一(余)法:某个格子的候选数只剩下一个数字,则该数字必填如该格子对应于唯一候选数法
摒除法:如果某个数字在某宫所有格孓的所有候选数中总共只出现一次,则该数字必填入候选数包含它的那个格子中行列情况同理。对应于隐性唯一候选数法
三链数删减法:找出某一列、某一行或某一个九宫格中的某三个宫格候选数中,相异的数字不超过3个的情形
进而将这3个数字自其它宫格的候选数中删減掉的方法就叫做三链数删减法。
反复应用候选数删减法寻找必填项直到候选数未发生变化(即找不到必填项了)
然后才递归寻解(如果上一步骤找到了解,那递归寻解只输出解了)
以下是对一个标准17数独(单解)的执行结果
从上面示例可以看出,应用候选数删减法(人工)完全把一个標准17数独解出来了没有用到递归。
即便候选数删减法(人工)只找出了部分的必填项但也会大大减少了递归执行的时间。