数独算法详解
❶ 数独算法
给你数独计算器:
http://blog.xunlei.com/web/category.html?uin=mianmiany1978&category_id=143
数独游戏:
http://blog.xunlei.com/web/category.html?uin=mianmiany1978&category_id=174
数独算法:
http://www.puzzle8.com/suku/news.asp
数独快速入门(上篇)
数独快速入门(中篇)
数独快速入门(下篇)
唯一解法
唯一候选数法
隐性三链数删减法
隐性数对删减法
三链列删减法
区块删减法
矩形顶点删减法
关键数删减法
补充:
合格的数独是只有唯一解。
而数独有难易度的分类,找一份报纸注意刊登的数独谜题是1星,还是5星。
在网络上,更分成容易题、进阶题、难题、极难题、超难题....
一般都是依据需要运用的技巧,而技巧是区分难易的。
数独不用猜测,解题全部是运用逻辑推理。
数独不用电脑程序分析,就可以解的题目是直观法数独题。
而超难题是需要电脑分析,及把全盘标示可选数,那是可选数谜题。
没有所谓解题通则。
1.直观解(一般报纸、书籍)
直观法技巧
直观法技巧 01 (容易级) 唯一解
直观法技巧 02 (容易级) 基本摒除
直观法技巧 03 (进阶级) 宫对行列摒除
直观法技巧 04 (进阶级) 行列对宫摒除
直观法技巧 05 (进阶级) 群组解法
直观法技巧 06 (困难级) X-Wing摒除法01
直观法技巧 06 (困难级) X-Wing摒除法02
直观法技巧 07 (困难级) 数偶摒除法
http://hi..com/kiwy07/blog/item/181fc482a153f3bd6c8119ab.html
2.可选数(以程序自动生成可选数)
Last value in block, row or column
Hidden Single in block
Hidden Single in row or column
Direct Pointing
Direct Claiming
Direct Hidden Pair
Naked Single
Direct Hidden Triplet
Pointing
Claiming
Naked Pair, X-Wing, Hidden Pair
Naked Triplet, Swordfish, Hidden Triplet
XY-Wing, XYZ-Wing
Unique rectangles and loops
Naked Quad, Jellyfish, Hidden Quad
Bivalue Universal Graves
Aligned Pair Exclusion
Bidirectioal X-Cycles and Y-Cycles
Forcing X-Chains
Forcing Chains, Bidirectional Cycles
Nishio
Cell/Region Forcing Chains
Dynamic Forcing Chains
http://diuf.unifr.ch/people/juillera/Sudoku/FAQ.html
通则无法解的题
直观难题
006589307
030602008
809703500
000891403
394265871
180374000
003026785
000458030
008037200
可选数极难题
970000000
003927000
008410709
300700400
060050070
007040003
105074900
000068507
786000042
不要把谜题解一次列出,而是找出下一步,及他的逻辑推理方法。
不要用猜测。
❷ 数独的计算公式是什么
数独的计算公式是每一横行、每一竖行和每一斜行的和都等于15。
❸ 数独是如何计算的
数独用到计算的就是“45法则”:
每行的数字和=45
每列的数字和=45
每宫的数字和=45
有以下几个方法
联除法:在并排的三个九宫格中的两排寻找相同数字,再利用九宫格得出另一排中该数字位置,该方法适用于中高级数独
巡格法:找出在每个九宫格中出现频率较高的数字,得出该数字在其余九宫格内位置,该方法应用于方法一之后.
排它法:这个方法是解决问题的关键,易被常人所忽略.在各行列或九宫格中观察,若有个位置其它数字都不能填,就填余下的数字
待定法:此方法不常用却很有效.暂时确定某个数字在某个区域,再利用其来进行排除
假设法:即在某个位置随机的填上一个数字,再进行推演,并有可能最终产生矛盾而否定结论行列法:此方法用于收官阶段,利用先从行列突破来提高解题效
频率法:这种方法相比于上一种方法更能提高效率.在某一行列或九宫格列举出所有情况,再选择某位置中出现频率高的数字。
❹ 数独解题的方法
原创回答:
建议你去OUBK网学习,那里有全面的数独技巧教学,每种技巧一片文章,文章不长,有一个小时就能看完,还有动态图的示例~
网站里还有大量的数独题目和解答过程~
数独解法一般分两类~一类是直观法,一类是候选法~
直观法(Direct Elimination Techniques)中,常用的算法包括:
单元唯一法 ( Sole Position Technique )
单元排除法 ( Basic Elimination Technique )
区块排除法 ( Block Elimination Technique )
唯一余数法 ( Sole Number Technique )
组合排除法 ( Combination Elimination Technique)
矩形排除法 ( Rectangle Elimination Technique)
在候选法中,常用的算法包括:
显式唯一法 (Naked Single)
隐式唯一法 (Hidden Single)
区块删减法 (Intersection Removal)
显式数对法 (Naked Pair)
显式三数集法 (Naked Triplet)
显式四数集法 (Naked Quad)
隐式数对法 (Hidden Pair)
隐式三数集法 (Hidden Triplet)
隐式四数集法 (Hidden Quad)
矩形对角线法 (X-wing)
XY形态匹配法(XY-wing)
XYZ形态匹配法(XYZ-wing)
三链数删减法 (Swordfish)
WXYZ形态匹配法(WXYZ-wing)
❺ 数独技巧公式6字
数独盘面是个九宫,每一宫又分为九个小格。在这八十一格中给出一定的已知数字和解题条件,利用逻辑和推理,在其他的空格上填入1-9的数字。使1-9每个数字在每一行、每一列和每一宫中都只出现一次,所以又称“九宫格”。
九宫格为数独的“前身”,最早起源于中国。数千年前,我们的祖先就发明了洛书,其特点较之现在的数独更为复杂,要求纵向、横向、斜向上的三个数字之和等于15,而非简单的九个数字不能重复。
(5)数独算法详解扩展阅读
数独起源于18世纪初瑞士数学家欧拉等人研究的拉丁方阵(Latin Square)。19世纪80年代,一位美国的退休建筑师格昂斯(Howard Garns)根据这种拉丁方阵发明了一种填数趣味游戏,这就是数独的雏形。20世纪70年代,人们在美国纽约的一本益智杂志《Math Puzzles and Logic Problems》上发现了这个游戏,当时被称为填数字(Number Place),这也是公认的数独最早的见报版本。
1984年一位日本学者将其介绍到了日本,发表在Nikoli公司的一本游戏杂志上,当时起名为“数字は独身に限る”(すうじはどくしんにかぎる),就改名为“数独”(すうどく),其中“数”(すう)是数字的意思,“独”(どく)是唯一的意思。
❻ 九宫数独怎么算
九宫格的计算口诀:二、四为肩, 六、八为足。 上九下一, 左七右三
举个例子:15、-12、-9、-6、-3、0、3、6、9
因为这组数的差是一样的,因此可以给他们编号-15、-12、-9、-6、-3、0、3、6、9可以分别为①、②、③、④、⑤、⑥、⑦、⑧、⑨
这样就变成我们平时所用的简单九宫格了,根据口诀:2、4为肩,6、8为脚5为中的口诀,可以推出:
②⑨④
⑦⑤③
⑥①⑧
再把序号变成原数字,就得到答案:
-12、3、0
9 、-3、-15
-6、-9、6
九宫格数独口诀:
第一招:三星分轨——先看右下和右中两个小九宫格中,各有一个8,右上的小九宫格中,从右至左,三列中往下看都有8了,所以8必在此宫中最左一列。
而最左一列5和4下只有一个空位,自然必定是8!再看左边三个小九宫格中,同理,1和3列中均有9,而当中一列最上的九宫格内只有一个空位,是9无疑!同理,左下小九宫格中的4也是如此推理填入。
扩展内容:
九宫格技巧:
联除法:在并排的三个九宫格中的两排寻找相同数字,再利用九宫格得出另一排中该数字位置,该方法适用于中高级数独
巡格法:找出在每个九宫格中出现频率较高的数字,得出该数字在其余九宫格内位置,该方法应用于方法一之后.
排它法:这个方法是解决问题的关键,易被常人所忽略.在各行列或九宫格中观察,若有个位置其它数字都不能填,就填余下的数字
待定法:此方法不常用却很有效.暂时确定某个数字在某个区域,再利用起来进行排除
假设法:即在某个位置随机地填上一个数字,再进行推演,并有可能最终产生矛盾而否定结论
行列法:此方法用于收官阶段,利用先从行列突破来提高解题效率
频率法:这种方法相比于上一种方法更能提高效率.在某一行列或九宫格列举出所有情况,再选择某位置中出现频率高的数字。
❼ 数独的计算公式是什么
数独用到计算的就是“45法则”:
每行的数字和=45
每列的数字和=45
每宫的数字和=45
而且数独计算一般只在Killer Sudoku才用,其它形式的题目不用
横排由上而下分别为 A-I,直排由左至右分别为1-9。
破解公式-1:利用同一排数字及同一九宫格内数字不能重复原则。要特别检视横线或直线三个九宫格内,有无两个相同的数字,就有机会为第三个找到定位。举例如下:
破解公式-2:注意任何一个九宫格内有直排或横排,全部空白时,与其他九宫格同一排相关联的数字,应该会出现在本九宫格的其他位置。举例如下:
注意F横排,由于F1-F3为空格,因此同一排的4, 6, 8, 数字,应该会在F1-F3的九宫格内的其他位置,也就是D1, D2, E3位置。由于I2=6, B2=4,E9=4因此D2=8, E3=6,D1=4。
破解公式-3:记得公式-1要经常再度检查运用,因为有些原有的空格已经出现数字,有机会可在相关空格填入数字。
破解公式-4:现在需要将九宫格内的空格可能数字,与其同一排的数字排除重复。记得要从较少格数作假设,然后在比对排除不可能的数字。(记得要横格,直格,九宫格互相比对)
一般高难度时,会需要用到5个空格,也就是只有4个数字出现。举例如下:
H横排剩余空格为1, 4, 5, 7而第5直排有4, 5, 7因此H5=1
❽ 数独算法思路
数独(数和)(英:Cross Sums;日:カックロ)是一种数学智力游戏。数和把填字游戏和数独巧妙地结合在一起,采用填字游戏式的棋盘,解题时在空格中填上1-9的数字。这种游戏不仅需要逻辑思维能力,还需要一点加法运算。
电脑自动生成数独游戏的谜题
要得出所有满足条件的组合确实不是件容易的事情(主要是很多,打印起来很慢) 。但偶们的目标只是每次能得到一个新的组合,然后从格子里面随机遮掉一些数字就可以了。所以只需要在解数独游戏算法的基础上稍作修改即可。
所以,算法的步骤是:
1.往第一行或第一列随机填1-9的数字
2.调用解数独算法得到一个结果
3.每行随机遮掉1-8个数字。如果需要较大的难度,也可以将1-8改为2-8或3-8,等等。
以下是console工程的代码:
// sudoku.cpp : 定义控制台应用程序的入口点。
// by superarhow([email protected])
#include "stdafx.h"
#include "conio.h"
#define SUCCESS 1
#define _FAILED 0
/* 地图类型9*9的char,每个char从0-9,0表示待填 */
typedef char MAPTYPE[9][9];
/* 行数据,同时用作“可能性”数据。如LINETYPE a; 当a[0]为真时表示
当前位置可填1,a[1]为真时表示可填2,以此类推 */
typedef char LINETYPE[9];
typedef void (*ONMAPOKCALLBACK)(MAPTYPE map);
/* 打印地图 */
void mp_map(MAPTYPE dest)
{
for ( int j = 0; j < 9; j++ )
{
for ( int i = 0; i < 9; i++ )
{
printf("%d ", dest[i][j]);
}
printf("\n");
}
printf("\n");
}
int fill_line(MAPTYPE dest, int line, ONMAPOKCALLBACK callback);
/* 填下一个格子。本行的可能性已在调用前算好,要考虑的是列的可能性和九宫格的可能性 */
/* nums_possible : array (0-8) means possible of number (1-9) */
int fill_pos(MAPTYPE dest, LINETYPE nums_possible, int line, int pos, ONMAPOKCALLBACK callback)
{
if ( pos >= 9 )
{
return fill_line(dest, line + 1, callback);
}
if ( dest[pos][line] != 0 ) return fill_pos(dest, nums_possible, line, pos + 1, callback);
for ( int i = 0; i < 9; i++ )
{
if ( !nums_possible[i] ) continue;
/* 检查本列是否重复 */
int vetical_failed = 0;
for ( int j = 0; j < 9; j++ )
if ( dest[pos][j] == i + 1 )
{
vetical_failed = 1;
break;
}
if ( vetical_failed ) continue;
/* 检查九宫格是否重复 */
int nine_failed = 0;
int m = pos / 3;
int n = line / 3;
m *= 3;
n *= 3;
for ( int y = n; y < n + 3; y++ )
{
for ( int x = m; x < m + 3; x++ )
{
if ( dest[x][y] == i + 1 )
{
nine_failed = 1;
break;
}
}
if ( nine_failed ) break;
}
if ( nine_failed ) continue;
/* all ok, try next position */
dest[pos][line] = i + 1;
nums_possible[i] = 0;
if ( fill_pos(dest, nums_possible, line, pos + 1, callback) )
{
/* 本行已全部OK,尝试下一行 */
if ( fill_line(dest, line + 1, callback) ) return SUCCESS;
/* 下一行失败,重新尝试本位置的剩余可能性 */
}
nums_possible[i] = 1;
dest[pos][line] = 0;
}
return _FAILED;
}
/* 填下一行 */
int fill_line(MAPTYPE dest, int line, ONMAPOKCALLBACK callback)
{
if ( line >= 9 )
{
/* map */
callback(dest);
return SUCCESS;
}
LINETYPE nums;
LINETYPE saveline;
/* calc possibility(for the current line) */
for ( int i = 0; i < 9; i++ ) nums[i] = 1; /* all can be */
for ( int i = 0; i < 9; i++ )
{
char n = dest[i][line];
/* save line */
saveline[i] = dest[i][line];
if ( n != 0 ) nums[n - 1] = 0; /* appears */
}
if ( !fill_pos(dest, nums, line, 0, callback) )
{
/* restore line */
for ( int i = 0; i < 9; i++ ) dest[i][line] = saveline[i];
return _FAILED;
}
return SUCCESS;
}
MAPTYPE g_result;
void on_map_ok(MAPTYPE map)
{
memcpy(g_result, map, sizeof(MAPTYPE));
}
#include "windows.h"
int _tmain(int argc, _TCHAR* argv[])
{
MAPTYPE dest;
memset(dest, 0, sizeof(MAPTYPE));
srand( GetTickCount() );
/* 随机填充第一行 */
char ch[9] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
for ( int i = 0; i < 9; i++ )
{
int p = rand() % 9;
char t = ch[p];
ch[p] = ch[i];
ch[i] = t;
}
for ( int i = 0; i < 9; i++ ) dest[i][0] = ch[i];
if ( fill_line(dest, 0, on_map_ok) )
{
/* 修剪掉一些块 */
for ( int i = 0; i < 9; i++ )
{
/* 调整n的取值范围可改变难度 %6 + 3是比较难的 */
int n = (rand() % 6) + 3;
for ( int j = 0; j < 9; j++ ) ch[j] = j; /* ch: index to erase */
for ( int j = 0; j < 9; j++ )
{
int p = rand() % 9;
char t = ch[p];
ch[p] = ch[i];
ch[i] = t;
}
for ( int j = 0; j < n; j++ ) g_result[ch[j]][i] = 0;
}
mp_map(g_result);
}
getch();
return 0;
}
看完这些,你对数独的算法了解了吗?
❾ 计算数独有什么方法
数独(すうどく,Sūdoku)是一种运用纸、笔进行演算的逻辑游戏。玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个粗线宫内的数字均含1-9,不重复。
数独盘面是个九宫,每一宫又分为九个小格。在这八十一格中给出一定的已知数字和解题条件,利用逻辑和推理,在其他的空格上填入1-9的数字。使1-9每个数字在每一行、每一列和每一宫中都只出现一次,所以又称“九宫格”。
【基本方法】
解题的本质有二:隐性唯一解(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,或称备选数)。
直观法和候选数法只是填制时候是否有注记的区别,依照个人习惯而定,并非鉴定题目难度或技巧难度的标准,无论是难题或是简单题都可上述方法填制,一般程序解题以候选数法较多。
【进阶解法】
上述方法称为基础解法(Basic Techniques),其他所有的解法称为进阶解法(Advanced Techniques),是在补基本解法之不足,所以又称辅助解法。
进阶解法包括:区块摒除法(Locked Candidates)、数组法(Subset)、四角对角线(X-Wing)、唯一矩形(Unique Rectangle)、全双值坟墓(Bivalue Universal Grave)、单数链(X-Chain)、异数链(XY-Chain)及其他数链的高级技巧等等。已发展出来的方法有近百种之多。
其中前两种加上基础解法为一般数独书中介绍并使用的方法,同时也是大部分人可以理解并掌握的数独解题技法。
通过基础解法出数只需一种解法,摒除法或唯余法,超出此范围而需要施加进阶解法时,解题点需要进阶解法协助基础解法来满足隐性唯一或显性唯一才能出数,该解题点的解法需要多个步骤协力完成,因此称做组合解法。
相对概率
相对概率不是真实的概率,而是用于同一格中的几个数字之间相互比较出现的可能。
相对概率 = 九宫格出现的概率 × 行出现的概率 × 列出现的概率
九宫格出现的概率:如果九宫格中有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个数字的相对概率进行对比,相对概率越大,出现的可能性越大。
区块摒除法
区块摒除法包括宫区块摒除法(Pointing)与行列区块摒除法(Claiming)。
在基础题里,利用区块摒除可以替代一些基础解法的观察,或辅助基础解法寻找焦点。
在非基础题里,区块可以隐藏任何其他结构,简单的可以把基础解法隐藏起来,难的可以隐藏数对等等其他进阶技巧。
例如:
区块摒除法
首先数字6对第五宫摒除,得到第五宫的6在R4C5或者R6C5。
不论是在R4C5或者R6C5,C5的其他格都不能再有数字6。(R4C5与R6C5就是数字6的区块,这也是区块摒除作用的观点)
数字6对第二宫摒除,得解R1C4=6。
❿ 数独怎么玩 数独游戏的基本解法
数独盘面是个九宫,每一宫又分为九个小格。在这八十一格中给出一定的已知数字和解题条件,利用逻辑和推理,在其他的空格上填入1-9的数字。使1-9每个数字在每一行、每一列和每一宫中都只出现一次,所以又称“九宫格”。
解题手法
依解题填制的过程可区分为直观法与候选数法。
直观法就是不做任何记号,直接从数独的盘势观察线索,推论答案的方法。
候选数法就是删减等位群格位已出现的数字,将剩余可填数字填入空格做为解题线索的参考,可填数字称为候选数(Candidates,或称备选数)。
直观法和候选数法只是填制时候是否有注记的区别,依照个人习惯而定,并非鉴定题目难度或技巧难度的标准,无论是难题或是简单题都可上述方法填制,一般程序解题以候选数法较多。
摒除法
摒除法:用数字去找单元内唯一可填空格,称为摒除法,数字可填唯一空格称为摒余解(Hidden Single)。
根据不同的作用范围,摒余解可分为下述三种:
数字可填唯一空格在“宫”单元称为宫摒余解(Hidden Single in Box),这种解法称宫摒除法。
数字可填唯一空格在“行”单元称为行摒余解(Hidden Single in Row),这种解法称行摒除法。
数字可填唯一空格在“列”单元称为列摒余解(Hidden Single in Column),这种解法称列摒除法。
行摒余解和列摒余解合称行列摒余解(Hidden Single in Line)。
得到行列摒余解的方法称为行列摒除法。
余数法
Peer等位群格位
余数法:用格位去找唯一可填数字,称为余数法,格位唯一可填数字称为唯余解(Naked Single)。
余数法是删减等位群格位(Peer)已出现的数字的方法,每一格位的等位群格位有 20 个,如图七所示。
进阶解法
上述方法称为基础解法(Basic Techniques),其他所有的解法称为进阶解法(Advanced Techniques),是在补基本解法之不足,所以又称辅助解法。
进阶解法包括:区块摒除法(Locked Candidates)、数组法(Subset)、四角对角线(X-Wing)、唯一矩形(Unique Rectangle)、全双值坟墓(Bivalue Universal Grave)、单数链(X-Chain)、异数链(XY-Chain)及其他数链的高级技巧等等。已发展出来的方法有近百种之多。
其中前三种加上基础解法为一般数独书中介绍并使用的方法,同时也是大部分人可以理解并掌握的数独解题技法。
通过基础解法出数只需一种解法,摒除法或唯余法,超出此范围而需要施加进阶解法时,解题点需要进阶解法协助基础解法来满足隐性唯一或显性唯一才能出数,该解题点的解法需要多个步骤协力完成,因此称做组合解法。
解题必须以逻辑为依归,猜测的方法被称为暴力型解法(Brute Force),这不是提倡数独的本意。
区块摒除法
区块摒除法包括宫区块摒除法(Pointing)与行列区块摒除法(Claiming)。
在基础题里,利用区块摒除可以替代一些基础解法的观察,或辅助基础解法寻找焦点。
在非基础题里,区块可以隐藏任何其他结构,简单的可以把基础解法隐藏起来,难的可以隐藏数对等等其他进阶技巧。
区块摒除法
首先数字6对第五宫摒除,得到第五宫的6在R4C5或者R6C5。
不论是在R4C5或者R6C5,C5的其他格都不能再有数字6。(R4C5与R6C5就是数字6的区块,这也是区块摒除作用的观点)
数字6对第二宫摒除,得解R1C4=6。
数对法
当一个单元(行、列、宫)的某两个数字仅可能在某两格时,我们称这两个格为这两个数的数对(Pairs)。
数对出现在宫称为宫数对;数对出现在行列成为行列数对。
用候选数法的观点去看,数对有两种,一种是在同单元内其中两格有相同的双候选数,一看就明白,因此称为显性数对(Naked Pair),另一种是,同单元内有两个候选数占用了相同的两格,该两格因为还有其它候选数很难辨认,因此称为隐性数对(Hidden Pair)。