数独解法全是由规则衍生出来的,基本解法分为两类思路,一类为排除法,一类为唯一法。更复杂的解法,最终也会归结到这两大类中。 下边以图示简单介绍几种解法,只要你花几分钟看一遍,马上就可以开始做数独了。 基础摒除法 基础摒除法就是利用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个数字时,也可采用排除法。
#include <windowsh>
#include <stdioh>
#include <timeh>
char sd[81];
bool isok = false;
//显示数独
void show()
{
if (isok) puts("求解完成");
else puts("初始化完成");
for (int i = 0; i < 81; i++)
{
putchar(sd[i] + '0');
if ((i + 1) % 9 == 0) putchar('\n');
}
putchar('\n');
}
//读取数独
bool Init()
{
FILE fp = fopen("intxt", "rb");
if (fp == NULL) return false;
fread(sd, 81, 1, fp);
fclose(fp);
for (int i = 0; i < 81; i++)
{
if (sd[i] >= '1' && sd[i] <= '9') sd[i] -= '0';
else sd[i] = 0;
}
show();
return true;
}
//递归解决数独
void force(int k)
{
if (isok) return;
if (!sd[k])
{
for (int m = 1; m <= 9; m++)
{
bool mm = true;
for (int n = 0; n < 9; n++)
{
if ((m == sd[k/2727+(k%9/3)3+n+n/36]) || (m == sd[9n+k%9]) || (m == sd[k/99+n]))
{
mm = false;
break;
}
}
if (mm)
{
sd[k] = m;
if (k == 80)
{
isok = true;
show();
return;
}
force(k + 1);
}
}
sd[k] = 0;
}
else
{
if (k == 80)
{
isok = true;
show();
return;
}
force(k + 1);
}
}
int main()
{
system("CLS");
if (Init())
{
double start = clock();
force(0);
printf("耗时%0fms", clock() - start);
}
else puts("初始化错误");
getchar();
}
有以下6种方法:
1、联除法,在并排的三个九宫格中的两排寻找相同数字,再利用九宫格得出另一排中该数字位置,该方法适用于中高级数独;
2、巡格法,找出每个九宫格中出现频率较高的数字,得出该数字在其余九宫格内位置,该方法应用于方法一之后;
3、排它法,在各行列或九宫格中观察,若有位置,其它数字不可填,即填余下的数字;
4、待定法,暂时确定某个数字在某个区域,再利用其来进行排除;
5、行列法,此方法用于收官阶段,利用先从行列突破来提高解题效率;
6、假设法,在某个位置随机填入一个数字,再进行推演,并有可能最终产生矛盾而否定结论。
数独技巧口诀,首先基础排除法,排除行列中已经出现的数字,其次唯一解法,行列已经出现八个没有重复的数字时,剩余的数字唯—解,最后余数测试,假设数字推出结果。
1,将基础问题的解决方法分成两种,一种是排除的,一种是独特的。再多的问题,也会归于这两个方面。下面的例子是一些简单的解题方法,你只需要花上几分钟的时间,就能很快地学会数独。数独直观法的解题技术有:唯一解法、基本排除法、区块排除法、唯余法、矩形除法、单元排除法、余数测试法等。
2,数独的基础结构是81格,每一行9格,每一列9格,9格为一句话,可以分为3×3的九宫格,而赢的前提是玩家根据所给的数字来填满,所以每一行、每一行、每一列、每一格都不能重复。
1、联除法:在并排的三个九宫格中的两排寻找相同数字,再利用九宫格得出另一排中该数字位置,该方法适用于中高级数独。
2、巡格法:找出在每个九宫格中出现频率较高的数字,得出该数字在其余九宫格内位置,该方法应用于方法一之后。
3、排它法:这个方法是解决问题的关键,易被常人所忽略、在各行列或九宫格中观察,若有个位置其它数字都不能填,就填余下的数字。
4、待定法:此方法不常用却很有效、暂时确定某个数字在某个区域,再利用其来进行排除
5、行列法:此方法用于收官阶段,利用先从行列突破来提高解题效率。
6、假设法:作为一名高手,我不提倡这种方法、即在某个位置随机的填上一个数字,再进行推演,并有可能最终产生矛盾而否定结论。
7、频率法:这种方法相比于上一种方法更能提高效率、在某一行列或九宫格列举出所有情况,再选择某位置中出现频率高的数字。
以上就是关于数独的常用解法。全部的内容,包括:数独的常用解法。、c语言编写的解数独程序、数独有哪几种解法分别是什么等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)