解题的本质有二:隐性唯一解(Hidden Single)及显性唯一解(Naked Single),他们的名称是在候选数法的基础上命名的。
解题必须以逻辑为依归,猜测的方法被称为“暴力型”解法(Brute Force),这不是提倡数独的本意。
根据解题本质发展出来的基本解题方法有二种:
数独摒除法
摒除法:用数字去找单元内唯一可填空格,称为摒除法,数字可填唯一空格称为摒余解(隐性唯一解)。
根据不同的作用范围,摒余解可分为下述三种:
数字可填唯一空格在「宫」单元称为宫摒余解(Hidden Single in Box),这种解法称宫摒除法。
数字可填唯一空格在「行」单元称为行摒余解(Hidden Single in Row),这种解法称行摒除法。
数字可填唯一空格在「列」单元称为列摒余解(Hidden Single in Column),这种解法称列摒除法。
行摒余解和列摒余解合称行列摒余解(Hidden Single in Line)。
得到行列摒余解的方法称为行列摒除法。
数独余数法
Peer等位群格位
余数法:用格位去找唯一可填数字,称为余数法,格位唯一可填数字称为唯余解(Naked Single)。
余数法是删减等位群格位(Peer)已出现的数字的方法,每一格位的等位群格位有 20 个,如图七所示。
依解题填制的过程可区分为直观法与候选数法:
数独直观法
直观法就是不做任何记号,直接从数独的盘势观察线索,推论答案的方法。
数独候选数法
候选数法就是删减等位群格位已出现的数字,将剩余可填数字填入空格做为解题线索的参考,可填数字称为候选数(Candidates,或称备选数)。
直观法和候选数法只是填制时候是否有注记的区别,依照个人习惯而定,并非鉴定题目难度或技巧难度的标准,无论是难题或是简单题都可上述方法填制,一般程序解题以候选数法较多。[
九宫格数独 百科名片
九宫格数独,是一种源自18世纪末的瑞士,后在美国发展、并在日本得以发扬光大的数字谜题。数独盘面是个九宫,每一宫又分为九个小格。在这八十一格中给出一定的已知数字和解题条件,利用逻辑和推理,在其他的空格上填入1-9的数字。使1-9每个数字在每一行、每一列和每一宫中都只出现一次。这种游戏全面考验做题者观察能力和推理能力,虽然玩法简单,但数字排列方式却千变万化,所以不少教育者认为数独是训练头脑的绝佳方式。
目录[隐藏]
数独的历史
数独的基本结构与规则元素构成
规则
基本解法举例基础摒除法
唯一解法
唯余解法
区块摒除法
余数测试法
隐性唯一候选数法
三链数删减法
隐性三链数删减法
矩形顶点删减法
三链列删减法
关键数删减法
变形数独概述
数独的近亲
给出最少数字且有唯一解的数独
求解数独的程序代码数独的历史
数独的基本结构与规则 元素构成
规则
基本解法举例 基础摒除法
唯一解法
唯余解法
区块摒除法
余数测试法
隐性唯一候选数法
三链数删减法
隐性三链数删减法
矩形顶点删减法
三链列删减法
关键数删减法
变形数独概述
数独的近亲
给出最少数字且有唯一解的数独
求解数独的程序代码
[编辑本段]数独的历史
数独前身为“九宫格”,最早起源于中国。数千年前,我们的祖先就发明了洛书,其特点较之现在的数独更为复杂,要求纵向、横向、斜向上的三个数字之和等于15,而非简单的九个数字不能重复。中国古籍《易经》中的“九宫图”也源于此,故称“洛书九宫图”。而“九宫”之名也因《易经》在中华文化发展史上的重要地位而保存、沿用至今。 1783年,瑞士数学家莱昂哈德·欧拉发明了一种当时称作“拉丁方块”(Latin Square)的游戏,这个游戏是一个n×n的数字方阵,每一行和每一列都是由不重复的n个数字或者字母组成的。 19世纪70年代,美国的一家数学逻辑游戏杂志《戴尔铅笔字谜和词语游戏》(Dell Puzzle Mαgαzines)开始刊登现在称为“数独”的这种游戏,当时人们称之为“数字拼图”(Number Place),在这个时候,9×9的81格数字游戏才开始成型。填充完整后 1984年4月,在日本游戏杂志《字谜通讯Nikoil》(《パズル通信ニコリ》)上出现了“数独”游戏,提出了“独立的数字”的概念,意思就是“这个数字只能出现一次”或者“这个数字必须是唯一的”,并将这个游戏命名为“数独”(sudoku)。 一位前任香港高等法院的新西兰籍法官高乐德(Wayne Gould)在1997年3月到日本东京旅游时,无意中发现了。他首先在英国的《泰晤士报》上发表,不久其他报纸也发表,很快便风靡全英国,之后他用了6年时间编写了电脑程式,并将它放在网站上,使这个游戏很快在全世界流行。从此,这个游戏开始风靡全球。后来更因数独的流行衍生了许多类似的数学智力拼图游戏,例如:数和、杀手数独。 中国大陆是在2007年2月28日正式引入数独 2007年2月28日,北京晚报智力休闲数独俱乐部(数独联盟sudokufederation前身)在新闻大厦举行加入世界谜题联合会的颁证仪式,会上谜题联合会秘书长皮特-里米斯特和俱乐部会长在证书上签字,这标志着北京晚报智力休闲俱乐部成为世界谜题联合会的39个成员之一,这也标志着俱乐部走向国际舞台,它将给数独爱好者带来更多与世界数独爱好者们交流的机会。
[编辑本段]数独的基本结构与规则
元素构成
数独基本元素示意图单元格:数独中最小的单元,标准数独中共有81个; 行:横向9个单元格的集合; 列:纵向9个单元格的集合; 宫:粗黑线划分的区域,标准数独中为3×3的9个单元格的集合; 已知数:数独初始盘面给出的数字; 候选数:每个空单元格中可以填入的数字。
规则
标准数独的规则为:数独每行、每列及每宫填入数字1-9且不能重复。
[编辑本段]基本解法举例
数独解法全是由规则衍生出来的,基本解法分为两类思路,一类为排除法,一类为唯一法。更复杂的解法,最终也会归结到这两大类中。 下边以图示简单介绍几种解法,只要你花几分钟看一遍,马上就可以开始做数独了。
基础摒除法
基础摒除法就是利用1 ~ 9 的数字在每一行、每一列、每一宫都只能出现一次的规则进行解题的方法。基础摒除法可以分为行摒除、列摒除、九宫格摒除。 实际寻找解的过程为: 寻找九宫格摒除解:找到了某数在某一个九宫格可填入的位置只余一个的情形;意即找到了 该数在该九宫格中的填入位置。 寻找列摒除解:找到了某数在某列可填入的位置只余一个的情形;意即找到了该数在该列中的填入位置。 寻找行摒除解:找到了某数在某行可填入的位置只余一个的情形;意即找到了该数在该行中的填入位置。 基础摒除法的提升方法是区块摒除法,是直观法中使用频率最高的方法之一
唯一解法
当某行已填数字的宫格达到8个,那么该行剩余宫格能填的数字就只剩下那个还没出现过的数字了。成为行唯一解 当某列已填数字的宫格达到8个,那么该列剩余宫格能填的数字就只剩下那个还没出现过的数字了。成为列唯一解 当某九宫格已填数字的宫格达到8个,那么该九宫格剩余宫格能填的数字就只剩下那个还没出现过的数字了。成为九宫格唯一解
唯余解法
唯余解法就是某宫格可以添入的数已经排除了8个,那么这个宫格的数字就只能添入那个没有出现的数字
区块摒除法
区块摒除法是基础摒除法的提升方法,是直观法中使用频率最高的方法之一
余数测试法
所谓余数测试法就是在某行或列,九宫格所填数字比较多,剩余2个或3个时,在剩余宫格添入值进行测试的解题方法
隐性唯一候选数法
当某个数字在某一列各宫格的候选数中只出现一次时,那么这个数字就是这一列的唯一候选数了.这个宫格的值就可以确定为该数字. 这是因为,按照数独游戏的规则要求每一列都应该包含数字1~9,而其它宫格的候选数都不含有该数,则该数不可能出现在其它的宫格,那么就只能出现在这个宫格了. 对于唯一候选数出现行,九宫格的情况,处理方法完全相同。
三链数删减法
找出某一列、某一行或某一个九宫格中的某三个宫格候选数中,相异的数字不超过3个的情形, 进而将这3个数字自其它宫格的候选数中删减掉的方法就叫做三链数删减法。
隐性三链数删减法
在某行,存在三个数字出现在相同的宫格内,在本行的其它宫格均不包含这三个数字,我们称这个数对是隐形三链数.那么这三个宫格的候选数中的其它数字都可以排除. 当隐形三链数出现在列,九宫格,处理方法是完全相同的. ------------------------------------------ 修改为:在某行,存在三个候选数字分别出现在三个宫格内, 在本行的其它宫格均不包含这三个数字,我们称这个数对是隐形三链数.那么这三个宫格的其它候选数都可以排除. 当隐形三链数出现在列,九宫格,处理方法是完全相同的 或者: 利用“找出某3个数字仅出现在某行、某列或某一个九宫格的某三个宫格候选数中的情形,进而将这三个宫格的候选数删减成该3个数字”的方法就叫做隐性三链数删减法(Hidden Triples)。
矩形顶点删减法
矩形顶点删减法和直观法讲到的矩形摒除法分析方法是一样的。矩形顶点删减法在识别时比较不容易找到,所以最好先使用其它的方法。
三链列删减法
三链列删减法是矩形顶点删减法的扩展,如果不清楚矩形顶点删减法,可以参考矩形顶点删减法,以便于更容易理解本节内容。 利用“找出某个数字在某三列仅出现在相同三行的情形,进而将该数字自这三行其他宫格候选数中删减掉”; 或“找出某个数字在某三行仅出现在相同三列的情形,进而将该数字自这三列其他宫格候选数中删减掉”的方法 就叫做三链列删减法。
关键数删减法
在进入到解题后期,利用前面讲到的唯一候选数法、隐性唯一候选数法、 区块删减法、数对删减法、隐性数对删减法、 三链数删减法、隐性三链数删减法、矩形顶点删减法、 三链列删减法都无法有进展的时候,可以考虑使用关键数删减法。关键数删减法就是在后期找到一个数,这个数在行(或列,九宫格)仅出现两次的数字。我们假定这个数在其中一个宫格类,继续求解,如果发生错误,则确定我们的假设错误。如果继续求解仍然出现困难,不妨假设这个数在另外一个宫格,看能不能得到错误。这就是关键数删减法 排除法 当某一列,某一行或某一宫里已填7个数字时,可采用排除法,排除不可能出现在这个格子的数,从而确定格子里应该填什么数。比如某一行已填1,3,4,5,7,8,9,还剩2,6,而其中一个空格所在的列上已有了2,可知这个空格里不可能是2,那么另外一个空格里一定是2,那么这个空格里一定是6。 当某一列,某一行或某一宫里已填6个数字时,也可采用排除法。
[编辑本段]变形数独概述
数独发展到今天,类型已经多种多样,如果按不同条件细分绝不下百种,而且数量还在增加中。大家平时可以常见的变形数独,如:对角线数独、锯齿数独、杀手数独等等。 对角线数独锯齿数独杀手数独 所谓变形数独,即改变一些标准数独的条件或规则,形成的新型数独题目,有的变形数独也会同时具备多种变形条件,变形条件如下: 1、使用数字的数量不同可以有4字数独、6字数独、16字数独、25字数独等等; 2、增加限制区域的类别可以有对角线数独、额外区域数独、彩虹数独等等; 3、宫形发生变化有锯齿数独;多个数独叠加起来有连体数独、武士数独、超级数独等等 4、用其它元素代替已知数字有字母数独、骰子数独、数码数独等等; 5、利用单元格内数字之和或乘积等关系有杀手数独、边框数独、箭头数独、魔方数独、算式数独等等; 6、利用相邻单元格内数字的关系有连续数独、不等号数独、堡垒数独、XV数独、黑白点数独等等; 7、单元格限制数字属性有奇偶数独、大中小数独等等; 8、利用数独外提示数字有边缘观测数独、摩天楼数独等等; 9、按禁止同一数字位置有无缘数独、无马数独等等; 10、非方形数独有圆环数独、立方体数独、六角数独、蜂窝数独等等; 11、需要多个数独条件配合才能解题的有三合一数独、双胞数独等等。 以上11种分类并非全部变化条件,只是常见的大类,还有不少变形数独未举例,其实变形的条件不会有极限的,只要你有想象力,可以创造出属于你自己的新型变形数独。虽然数独条件变换多端,但有一条始终不变的绝对条件——同一限制区域内不能出现重复数字。只要符合这个条件,就没有脱离“数独”的范畴。
[编辑本段]数独的近亲
谜题(Pazzle):排除文化差异对做题者的影响,只用数字和图形表示的逻辑推理游戏。 数独是谜题(Pazzle)中的一个分支,由于其规则简单、种类众多从而从众多谜题脱颖而出,成为大众熟知的数字谜题。 不过除了数独以外,还有不少谜题也非常出色,也有众多的拥护者,而且与数独有千丝万缕的关系。数独爱好者同样不能错过这些优秀的逻辑推理游戏。下面简单介绍几类谜题: 数和(Kakuro):与杀手数独很像的一类谜题,规则要求同行、同列(同一段)数字不能重复,且每段数字之和等于左边和上边的提示数字。 数图(Nonograms\Griddlers):根据盘面周围的数字提示,把盘中涂成符合条件的图案,很像“十字绣”。 数回(Slither Link):游戏由0,1,2,3四个数字组成。每一个数字,代表四周划线的数目,并在最后成为一个不间断、不分岔的回路。 数墙(Nurikabe):数墙的世界,是一个非黑即白的二元世界;在游戏中,你要决定的是,那些格子需要涂黑,那一些应该留白。 数连(Number Link):与数独一样,数连是一个简单明快的游戏。你只需要把属于相同数字的同伴,以线连接起来。不过,这个游戏看起来非常简单,实际上是很有深度的。 图独(tudoku):数独的一种扩展,将数字换成有趣的图形,看似一样,但换成图形后大大增强了数独趣味性,使游戏不会那么枯燥,很合适小孩子玩,即动脑又锻炼记忆力。
[编辑本段]给出最少数字且有唯一解的数独
数独初盘最少可以有17个数。 与数独终盘相对应,一个数独游戏给出的初始条件称为初盘。由于规则所限,给出的初盘数字个数必须在32以下。 一般常见的初盘数字个数在22—28之间,而数独爱好者们常问的一个问题是:最少给出多少个数字,数独游戏才确保有唯一解?具体地说:最少需要在初盘中给出多少个数字,使得移除其中任何一个数字该数独游戏便没有唯一解。 事实上,这个问题是数独中最有数学趣味的问题之一,并且至今仍未得到解决。但数学家们估计,这个数字很可能是1717个数字的最小唯一解初盘是由一名日本数独爱好者发现的。澳大利亚数学家GordonRoyle已经收集了36628个17个数字的唯一解初盘,而爱尔兰数学家Gary McGuire则致力于寻找16个数字的唯一解初盘,但至今仍无发现。部分数学家开始退而求其次,转而寻找只有两个解的16个数字初盘。 统计学家根据一个统计学原理曾随机地构造了大量17个数字的初盘,发现其中有唯一解的初盘只有数个未被GordonRoyle教授发现,这意味着,最小唯一解初盘问题的最终答案可能正是17:因为从理论上说,如果16个数字的唯一解终盘存在,那么每一个必将引起65个17个数字唯一解终盘的增加,而在研究中至今没有观察到这一效应。17个数的数独 望采纳谢谢
解题的本质有二:隐性唯一解及显性唯一解,他们的名称是在候选数法的基础上命名的。解题必须以逻辑为依归,猜测的方法被称为“暴力型”解法。根据解题本质发展出来的基本解题方法有二种:摒除法摒除法:用数字去找单元内唯一可填空格,称为摒除法,数字可填唯一空格称为摒余解(隐性唯一解)。根据不同的作用范围,摒余解可分为下述三种:数字可填唯一空格在「宫」单元称为宫摒余解,这种解法称宫摒除法。数字可填唯一空格在「行」单元称为行摒余解,这种解法称行摒除法。数字可填唯一空格在「列」单元称为列摒余解,这种解法称列摒除法。余数法 Peer等位群格位余数法:用格位去找唯一可填数字,称为余数法,格位唯一可填数字称为唯余解。余数法是删减等位群格位已出现的数字的方法,每一格位的等位群格位有 20 个,如图七所示。依解题填制的过程可区分为直观法与候选数法:直观法直观法就是不做任何记号,直接从数独的盘势观察线索,推论答案的方法。候选数法候选数法就是删减等位群格位已出现的数字,将剩余可填数字填入空格做为解题线索的参考,可填数字称为候选数。直观法和候选数法只是填制时候是否有注记的区别,依照个人习惯而定,并非鉴定题目难度或技巧难度的标准,无论是难题或是简单题都可上述方法填制,一般程序解题以候选数法较多。进阶解题方法编辑上述方法称为基础解法,其他所有的解法称为进阶解法,是在补基本解法之不足,所以又称辅助解法。进阶解法包括:区块摒除法、数组法、四角对角线、唯一矩形、全双值坟墓、单数链、异数链及其他数链的高级技巧等等。已发展出来的方法有近百种之多。其中前两种加上基础解法为一般数独书中介绍并使用的方法,同时也是大部分人可以理解并掌握的数独解题技法。通过基础解法出数只需一种解法,摒除法或唯余法,超出此范围而需要施加进阶解法时,解题点需要进阶解法协助基础解法来满足隐性唯一或显性唯一才能出数,该解题点的解法需要多个步骤协力完成,因此称做组合解法。相对概率相对概率不是真实的概率,而是用于同一格中的几个数字之间相互比较出现的可能。相对概率 = 九宫格出现的概率 × 行出现的概率 × 列出现的概率九宫格出现的概率:如果九宫格中有2个格可能出现1,目标格可能的数字为1、2、3,另一个格可能出现的数字为1、4,那么:目标格中的1在九宫格出现的概率 = 目标格中出现1的概率 × (1 - 另一个格中出现1的概率),得1/3 × (1-1/2) = 1/6。注意:1-1/2表示另一个格不出现1的概率,1/3 × (1-1/2) 的意思就是在另一个格不出现1的情况下,目标格出现1的概率。如果九宫格中有三个格可能出现1,目标格可能的数字为1、5、6,另一个格可能出现的数字为1、7,还有一个格可能出现的数字为1、8、9,得1/3 × (1-1/2) × (1-1/3) = 1/9。依此类推。行出现的概率和列出现的概率与九宫格出现的概率的算法原理相同。最后,把三个概率相乘,得到相对概率,把目标格中3个数字的相对概率进行对比,相对概率越大,出现的可能性越大。区块摒除法区块摒除法包括宫区块摒除法与行列区块摒除法。在基础题里,利用区块摒除可以替代一些基础解法的观察,或辅助基础解法寻找焦点。在非基础题里,区块可以隐藏任何其他结构,简单的可以把基础解法隐藏起来,难的可以隐藏数对等等其他进阶技巧。
#include <stdioh>
#include <conioh>
typedef struct _grid99
{
int value[9][9];
char disp[9][9];
} grid99;
char x_status[9][9];
char y_status[9][9];
char z_status[9][9];
typedef struct _list9
{
int value[9];
char disp[9];
} list9;
list9 l;
void print(grid99 g)
{
int i,j;
for(i=0; i<9; i++)
{
for(j=0; j<9; j++)
{
printf("%c ", g->disp[i][j]);
}
printf("\n");
}
printf("\n");
}
int check(grid99 g)
{
int i,j,x,y, value;
for(i=0; i<9; i++)
{
value=0;
for(j=0; j<9; j++)
{
value+=g->value[i][j];
}
if (value!=511)
{
return -1;
}
value=0;
for(j=0; j<9; j++)
{
value+=g->value[j][i];
}
if (value!=511)
{
return -1;
}
}
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
value=0;
for(x=0;x<3;x++)
{
for(y=0;y<3;y++)
{
value+=g->value[i3+x][j3+y];
}
}
if (value!=511)
{
return -1;
}
}
}
print(g);
return 0;
}
int f(int a_n)
{
int i, r=1;
for(i=1;i<=a_n;i++)
{
r=2;
}
return r;
}
void find(grid99 g, int level)
{
int i, k, x, y, z, id;
if(level>=81)
{
printf("level>=81");
return;
}
x=level/9;
y=level%9;
z=(int)(x/3)3+(int)(y/3);
for(i=0;i<9;i++)
{
if(x_status[x][i]=='Y' && y_status[y][i]=='Y' && z_status[z][i]=='Y')
{
g->value[x][y]=lvalue[i];
g->disp[x][y]=ldisp[i];
x_status[x][i]='N';
y_status[y][i]='N';
z_status[z][i]='N';
if(level==80)
{
check(g);
}
else
{
find(g, level+1);
}
id=g->disp[x][y]-0x30-1;
x_status[x][id]='Y';
y_status[y][id]='Y';
z_status[z][id]='Y';
g->value[x][y]=0;
g->disp[x][y]=0x30;
}
}
}
main()
{
int i,j,k;
grid99 g;
for(i=0; i<9; i++)
{
lvalue[i]=f(i);
ldisp[i]=i+0x30+1;
//printf("%c ", ldisp[i]);
//printf("%d ", lvalue[i]);
for(j=0; j<9; j++)
{
gvalue[i][j]=0;
gdisp[i][j]=0x30;
//printf("%c ", gdisp[i][j]);
//printf("%d ", gvalue[i][j]);
}
for(k=0;k<9;k++)
{
x_status[i][k]='Y';
y_status[i][k]='Y';
z_status[i][k]='Y';
}
}
find(&g,0);
}
void main()
{
int i,j,tmp;
int a[9][9];
int row=9,line=9;
for(i=0;i<line;i++)
a[0][i]=i+1;
tmp=a[0][0];
for(i=1;i<row;i++)
{
for(j=0;j<line-1;j++)
a[i][j]=a[i-1][j+1];
a[i][j]=tmp;
tmp=a[i][0];
}
for(i=0;i<row;i++)
{
for(j=0;j<line;j++)
printf("%d ",a[i][j]);
printf("\n");
}
123456789101112131415161718192021public static Geocache[] createGeocaches(int a) { if(a <= 0) return new Geocache[0]; Random rand = new Random(); Geocache[] result = new Geocache[a]; for(int i = 0; i < a; i++) { //因为题目没有描述,这里假设x, y是随机整数,Geocache有<a href=">
当年我们做大程的时候本来也想做数独来着,后来时间不够没做成不知道专业人士怎么编的,只能提供一点当时的思路给你,
199个格子对应一个数组A,数组的第一个值从0到9表示其中填的数字,0就是不填,另一个值表示它在桌面上的位置就是坐标
2需要10张,空白和9个数字
3通过对鼠标点击的反应改变格子数组A的值,且将相应覆盖在相应坐标上
4事先输入若干组数组A的值(每组81个数),作为题库
5进行游戏时随机抽取题库中的一组,再随机抽取若干格子显示出来,其他留白
6填完后用三个循环判断下每行每列每块是否有相同的数字,没有则通过
具体编按钮、放图、鼠标点击响应等各种问题查一下书,有很多书上有很多教的这种一小段一小段的程序源代码,直接抄下就行了。
加油^^
以上就是关于九宫数独的相关解法全部的内容,包括:九宫数独的相关解法、谁知道数独怎么玩、数独求解……等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)