数独设计的原理
以前我写过一个,基本上就是先随机生成完整数独方阵,然后去掉一定数量数字,再机器解题,如果找到多个解就重新生成。这样保证有且仅有一个解。
谜题没有必须对称的要求。
初始数字数量确实是直接决定难度的关键因素,越少时难度一般会越大。如果是傻瓜式的搜索,每少一个数字可以认为工作量会增加9倍。而除去盲猜以外的解题策略都会依赖于特殊位置上的数字组合,数字少的时候可用的策略就很少。需要注意的是就算初始数字个数相同的谜题其难度也会不同,取决于完整解题步骤中所使用的策略。
注意:
目前已知谜题中最少要有17个数字才能保证唯一解。
九宫格”是我国古已有之的一种结构构造方案,欧阳洵将之引入书法练习,取其结构的平稳性和秩序感;诸葛 孔明综合八卦和九宫理念,演化成九宫八卦阵,取其结构间的依存性;中国玄学更是将之引入奇门遁甲之术,加以引 申利用"九宫格"三纵、三横,形成9个独立而又相互依存的单位,内部规整又相互依存组合设计师从"九宫格"的 结构中获得设计灵感,以"九quot;的设计理念,对领行国际中心的平面进行了分隔设计中间格为电梯井、管井和楼 梯设计,8个面积大小不同的办公单位,依次排列在其周围8个独立的小模块单位,内部平整、开放,户间相互组合,
形成更大的组合开放空间从而使整体空间结构布局更规整,为空间的自由组合提供了更大的自由度"九宫格"的创始人是:欧阳洵。
数独的基本元素
单元格:数独中最小的单元,标准数独中共有81个;
行:横向9个单元格的集合;
列:纵向9个单元格的集合;
宫:粗黑线划分的区域,标准数独中为3×3的9个单元格的集合;
已知数:数独初始盘面给出的数字;
候选数:每个空单元格中可以填入的数字。
数独的基本规则
标准数独的规则为:数独每行、每列及每宫填入数字1-9且不能重复。
基本解法举例
数独解法全是由规则衍生出来的,基本解法分为两类思路,一类为排除法,一类为唯一法。更复杂的解法,最终也会归结到这两大类中。 下边以图示简单介绍几种解法,只要你花几分钟看一遍,马上就可以开始做数独了。
基础摒除法
基础摒除法就是利用1 ~ 9 的数字在每一行、每一列、每一宫都只能出现一次的规则进行解题的方法。基础摒除法可以分为行摒除、列摒除、九宫格摒除。
实际寻找解的过程为:
寻找九宫格摒除解:找到了某数在某一个九宫格可填入的位置只余一个的情形;意即找到了 该数在该九宫格中的填入位置。
寻找列摒除解:找到了某数在某列可填入的位置只余一个的情形;意即找到了该数在该列中的填入位置。
寻找行摒除解:找到了某数在某行可填入的位置只余一个的情形;意即找到了该数在该行中的填入位置。
基础摒除法的提升方法是区块摒除法,是直观法中使用频率最高的方法之一
唯一解法
当某行已填数字的宫格达到8个,那么该行剩余宫格能填的数字就只剩下那个还没出现过的数字了。成为行唯一解
当某列已填数字的宫格达到8个,那么该列剩余宫格能填的数字就只剩下那个还没出现过的数字了。成为列唯一解
当某九宫格已填数字的宫格达到8个,那么该九宫格剩余宫格能填的数字就只剩下那个还没出现过的数字了。成为九宫格唯一解
唯余解法
唯余解法就是某宫格可以添入的数已经排除了8个,那么这个宫格的数字就只能添入那个没有出现的数字
区块摒除法
区块摒除法是基础摒除法的提升方法,是直观法中使用频率最高的方法之一
余数测试法
所谓余数测试法就是在某行或列,九宫格所填数字比较多,剩余2个或3个时,在剩余宫格添入值进行测试的解题方法
隐性唯一候选数法
当某个数字在某一列各宫格的候选数中只出现一次时,那么这个数字就是这一列的唯一候选数了.这个宫格的值就可以确定为该数字.这时因为,按照数独游戏的规则要求每一列都应该包含数字1~9,而其它宫格的候选数都不含有该数,则该数不可能出现在其它的宫格,那么就只能出现在这个宫格了. 对于唯一候选数出现行,九宫格的情况,处理方法完全相同。
三链数删减法
找出某一列、某一行或某一个九宫格中的某三个宫格候选数中,相异的数字不超过3个的情形, 进而将这3个数字自其它宫格的候选数中删减掉的方法就叫做三链数删减法。
隐性三链数删减法
在某行,存在三个数字出现在相同的宫格内,在本行的其它宫格均不包含这三个数字,我们称这个数对是隐形三链数.那么这三个宫格的候选数中的其它数字都可以排除.
当隐形三链数出现在列,九宫格,处理方法是完全相同的.
矩形顶点删减法
矩形顶点删减法和直观法讲到的矩形摒除法分析方法是一样的。矩形顶点删减法在识别时比较不容易找到,所以最好先使用其它的方法。
三链列删减法
三链列删减法是矩形顶点删减法的扩展,如果不清楚矩形顶点删减法,可以参考矩形顶点删减法,以便于更容易理解本节内容。利用“找出某个数字在某三列仅出现在相同三行的情形,进而将该数字自这三行其他宫格候选数中删减掉”;或“找出某个数字在某三行仅出现在相同三列的情形,进而将该数字自这三列其他宫格候选数中删减掉”的方法 就叫做三链列删减法。
关键数删减法
在进入到解题后期,利用前面讲到的唯一候选数法、隐性唯一候选数法、 区块删减法、数对删减法、隐性数对删减法、三链数删减法、隐性三链数删减法、矩形顶点删减法、三链列删减法都无法有进展的时候,可以考虑使用关键数删减法。关键数删减法就是在后期找到一个数,这个数在行(或列,九宫格)仅出现两次的数字。我们假定这个数在其中一个宫格类,继续求解,如果发生错误,则确定我们的假设错误。如果继续求解仍然出现困难,不妨假设这个数在另外一个宫格,看能不能得到错误。这就是关键数删减法
createSdArr:function(){
//生成数独数组。
var that = this;
try{
thissdArr = [];
thissetThird(2,2);
thissetThird(5,5);
thissetThird(8,8);
var allNum = [1,2,3,4,5,6,7,8,9];
outerfor:
for(var i=1;i<=9;i++){
innerfor:
for(var j=1;j<=9;j++){
if(thissdArr[parseInt(i+''+j)]){
continue innerfor;
}
var XArr = thisgetXArr(j,thissdArr);
var YArr = thisgetYArr(i,thissdArr);
var thArr = thisgetThArr(i,j,thissdArr);
var arr = getConnect(getConnect(XArr,YArr),thArr);
var ableArr = arrMinus(allNum,arr);
if(ableArrlength == 0){
thiscreateSdArr();
return;
break outerfor;
}
var item;
//如果生成的重复了就重新生成。
do{
item = ableArr[getRandom(ableArrlength)-1];
}while(($inArray(item, arr)>-1));
thissdArr[parseInt(i+''+j)] = item;
}
}
thisbackupSdArr = thissdArrslice();
}catch(e){
//如果因为超出浏览器的栈限制出错,就重新运行。
thatcreateSdArr();
}
},
getXArr:function(j,sdArr){
//获取所在行的值。
var arr = [];
for(var a =1;a<=9;a++){
if(thissdArr[parseInt(a+""+j)]){
arrpush(sdArr[parseInt(a+""+j)])
}
}
return arr;
},
getYArr:function(i,sdArr){
//获取所在列的值。
var arr = [];
for(var a =1;a<=9;a++){
if(sdArr[parseInt(i+''+a)]){
arrpush(sdArr[parseInt(i+''+a)])
}
}
return arr;
},
getThArr:function(i,j,sdArr){
//获取所在三宫格的值。
var arr = [];
var cenNum = thisgetTh(i,j);
var thIndexArr = [cenNum-11,cenNum-1,cenNum+9,cenNum-10,cenNum,cenNum+10,cenNum-9,cenNum+1,cenNum+11];
for(var a =0;a<9;a++){
if(sdArr[thIndexArr[a]]){
arrpush(sdArr[thIndexArr[a]]);
}
}
return arr;
},
getTh:function(i,j){
//获取所在三宫格的中间位坐标。
var cenArr = [22,52,82,25,55,85,28,58,88];
var index = (Mathceil(j/3)-1) 3 +Mathceil(i/3) -1;
var cenNum = cenArr[index];
return cenNum;
},
setThird:function(i,j){
//为对角线上的三个三宫格随机生成。
var numArr = [1,2,3,4,5,6,7,8,9];
var sortedNumArr= numArrsort(function(){return Mathrandom()-05>0-1:1});
var cenNum = parseInt(i+''+j);
var thIndexArr = [cenNum-11,cenNum-1,cenNum+9,cenNum-10,cenNum,cenNum+10,cenNum-9,cenNum+1,cenNum+11];
for(var a=0;a<9;a++){
thissdArr[thIndexArr[a]] = sortedNumArr[a];
}
}
一、联除法。
在并排的三个九宫格中的两排寻找相同数字,再利用九宫格得出另一排中该数字位置,该方法适用于中高级数独
二、巡格法。
找出在每个九宫格中出现频率较高的数字,得出该数字在其余九宫格内位置,该方法应用于方法一之后。
三、排除法。
这个方法是解决问题的关键,易被常人所忽略。在各行列或九宫格中观察,若有个位置其它数字都不能填,就填余下的数字。
扩展资料:
如果一道题目的提示数少,那么题目就会相对难,提示数多则会简单,这是一般人判断难易的思维模式,但数独谜题提示数的多寡与难易并无绝对关系,多提示数比少提示数难的情况屡见不鲜,同时也存在增加提示数之后题目反而变难的情形,即使是相同提示数(甚或相同谜题图形)也可以变化出各式各样的难度。
提示数少对于出题的困难度则有比较直接的关系,以20-35提示数而言,每少一个提示数,其出题难度会增加数倍,在制作谜题时,提示数在22以下就非常困难,所以常见的数独题其提示数在23~30之间,其原因在于制作比较不困难,可以设计出比较漂亮的图形,另外这个提示数范围的谜题变化多端是一个重要因素。
欢迎分享,转载请注明来源:表白网
评论列表(0条)