锁定老帖子 主题:来玩数独吧,抛砖引玉
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-06-25
Eastsun 写道 仔细看了一下代码,除了代码写的有点BT外,其算法也没什么特殊的,就是简单的回溯算法.
不像是简单的回溯吧,“j%26+i-i%3-i%27+k”这里面的26,就是个挺奇怪的数字。 |
|
返回顶楼 | |
发表时间:2007-06-25
呵呵,我来给那个JAVA版的做个注释:
/** * Eastsun注释 */ class S{ /** * 尝试在b[]的第p-1个位置放置数字 */ static void r(char[]b,int p){ long u=0; //该long的第k(1至9)位bit代表当前位置是否可以放置数字k(是0否1) if(--p<0) System.out.print(b); //如果p-1<0说明所有位置已经放置好,已经求得一解 else if(b[p]>48) r(b,p); //>48,说明该位置是已经填好数字的,不需要尝试 else{ for(int i=81;i-->0;) u|= // (p-i)%9==0 :就是说p与i是同一列 // p/9^i/9==0 :就是说p与i是同一行 // p/27^i/27|p%9/3^i%9/3==0: 就是p与i在同一个小九宫 // 为什么是这样子?简单的数学题,呵呵. //我来解释一下最后一个,p/27==i/27相当于把大九宫按行分成3下,0~2行,3~5行,6~8行三部分, // 检查p与i是否属于同一个部分 // p%9是看p属于那一列,p%9/3是看p属于0~2列,3~5列,6~8列的那一部分 // so,p/27^i/27|p%9/3^i%9/3==0时,p与i属于同一小九宫 (p-i)%9*(p/9^i/9)*(p/27^i/27|p%9/3^i%9/3) ==0? 1L<<b[i]: //==0,说明这个位置对当前位置有影响,将u的该位置1 0; for(b[p]=58;--b[p]>48;) if((u>>b[p]&1)<1) //u>>b[p]&1 <1也就是u>>b[p]&1==0,说明这个b[p]是合理的, r(b,p); //试探下一个 //注意这个循环结束条件是 !--b[p]>48,也就是b[p]=='0',最后又将b[p]恢复到'0'不会影响回溯条件. } } public static void main(String[] a){ //从第80个位置开始试探. r(a[0].toCharArray(),81); } } |
|
返回顶楼 | |
发表时间:2007-06-25
庄表伟 写道 Eastsun 写道 仔细看了一下代码,除了代码写的有点BT外,其算法也没什么特殊的,就是简单的回溯算法.
不像是简单的回溯吧,“j%26+i-i%3-i%27+k”这里面的26,就是个挺奇怪的数字。 这个26是那个ruby版的吧?我不懂ruby,不晓得是不是与java的是同一种算法. |
|
返回顶楼 | |
发表时间:2007-06-25
我说,数独这东西,拿程序硬上,就没意思了啊
要写,也得写成下面那个flash里面的解法,要么直观法,要么候选数 flash里的是直观法,用来消磨时间相当合适 |
|
返回顶楼 | |
发表时间:2007-06-25
数独的规则是要求只能有一个唯一解,老庄,Eastsun的筛法和raimundox的amb法,都是用随机数来产生,可能会产生多个解的题目,数独是解题容易出题难...
|
|
返回顶楼 | |
发表时间:2007-06-25
看看这个:
http://perl.abigail.be/Talks/Sudoku/HTML/title.html |
|
返回顶楼 | |
发表时间:2007-06-25
deafwolf 写道 我说,数独这东西,拿程序硬上,就没意思了啊
要写,也得写成下面那个flash里面的解法,要么直观法,要么候选数 flash里的是直观法,用来消磨时间相当合适 这个,作为程序员,还是以提供编程技艺为要吧。 单纯的消磨脑力,那很多事情,都能够消磨的,就不必玩编程算法了。 不过,那个flash地址收藏了, |
|
返回顶楼 | |
发表时间:2007-06-25
Readonly 写道 数独的规则是要求只能有一个唯一解,老庄,Eastsun的筛法和raimundox的amb法,都是用随机数来产生,可能会产生多个解的题目,数独是解题容易出题难...
怎么才能生成只有一个解的数独呢? 目前的零散联想: 1、图的连通性,隐隐约约有点意思。 2、判断逻辑推理是否成立的冗余性,推理的真命题什么的。 3、最笨的办法,自己出题,自己试着穷举解,有多于一个解时,再加一个数,直到只有唯一解为止。 |
|
返回顶楼 | |
发表时间:2007-06-25
庄表伟 写道 Readonly 写道 数独的规则是要求只能有一个唯一解,老庄,Eastsun的筛法和raimundox的amb法,都是用随机数来产生,可能会产生多个解的题目,数独是解题容易出题难...
怎么才能生成只有一个解的数独呢? 目前的零散联想: 1、图的连通性,隐隐约约有点意思。 2、判断逻辑推理是否成立的冗余性,推理的真命题什么的。 3、最笨的办法,自己出题,自己试着穷举解,有多于一个解时,再加一个数,直到只有唯一解为止。 我想是不是可以弄出一个N元一次方程,比较容易看出的是每行每列,每个小九宫的数字和等于45,然后每个数字都属于1~9, 然后看这个方程是不是有唯一解,不过没仔细考虑这个是不是与原题等价,估计还要加其他约束条件. 不过及时把唯一性的弄出来了,这个数独难度的控制似乎也不好办. |
|
返回顶楼 | |
发表时间:2007-06-25
Readonly 写道 数独的规则是要求只能有一个唯一解,老庄,Eastsun的筛法和raimundox的amb法,都是用随机数来产生,可能会产生多个解的题目,数独是解题容易出题难...
好象更严格的说法是不止只有一个解,而且每一步解法都要能靠逻辑推出来(也就是每一步盘面上至少可以找到一个确定的数字)而不用被迫靠猜的。。。 |
|
返回顶楼 | |