论坛首页 综合技术论坛

来玩数独吧,抛砖引玉

浏览 24615 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-06-25  
Eastsun 写道
仔细看了一下代码,除了代码写的有点BT外,其算法也没什么特殊的,就是简单的回溯算法.


不像是简单的回溯吧,“j%26+i-i%3-i%27+k”这里面的26,就是个挺奇怪的数字。
0 请登录后投票
   发表时间: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);
    }
}

0 请登录后投票
   发表时间:2007-06-25  
庄表伟 写道
Eastsun 写道
仔细看了一下代码,除了代码写的有点BT外,其算法也没什么特殊的,就是简单的回溯算法.


不像是简单的回溯吧,“j%26+i-i%3-i%27+k”这里面的26,就是个挺奇怪的数字。

这个26是那个ruby版的吧?我不懂ruby,不晓得是不是与java的是同一种算法.
0 请登录后投票
   发表时间:2007-06-25  
我说,数独这东西,拿程序硬上,就没意思了啊

要写,也得写成下面那个flash里面的解法,要么直观法,要么候选数
flash里的是直观法,用来消磨时间相当合适
  • 数独.zip (97 KB)
  • 描述: 一个flash写的数独,原地址为http://www.shes.hcc.edu.tw/~oddest/sumain.htm
  • 下载次数: 51
0 请登录后投票
   发表时间:2007-06-25  
数独的规则是要求只能有一个唯一解,老庄,Eastsun的筛法和raimundox的amb法,都是用随机数来产生,可能会产生多个解的题目,数独是解题容易出题难...
0 请登录后投票
   发表时间:2007-06-25  
看看这个:

http://perl.abigail.be/Talks/Sudoku/HTML/title.html

0 请登录后投票
   发表时间:2007-06-25  
deafwolf 写道
我说,数独这东西,拿程序硬上,就没意思了啊

要写,也得写成下面那个flash里面的解法,要么直观法,要么候选数
flash里的是直观法,用来消磨时间相当合适


这个,作为程序员,还是以提供编程技艺为要吧。
单纯的消磨脑力,那很多事情,都能够消磨的,就不必玩编程算法了。

不过,那个flash地址收藏了,
0 请登录后投票
   发表时间:2007-06-25  
Readonly 写道
数独的规则是要求只能有一个唯一解,老庄,Eastsun的筛法和raimundox的amb法,都是用随机数来产生,可能会产生多个解的题目,数独是解题容易出题难...


怎么才能生成只有一个解的数独呢?

目前的零散联想:
1、图的连通性,隐隐约约有点意思。
2、判断逻辑推理是否成立的冗余性,推理的真命题什么的。
3、最笨的办法,自己出题,自己试着穷举解,有多于一个解时,再加一个数,直到只有唯一解为止。
0 请登录后投票
   发表时间:2007-06-25  
庄表伟 写道
Readonly 写道
数独的规则是要求只能有一个唯一解,老庄,Eastsun的筛法和raimundox的amb法,都是用随机数来产生,可能会产生多个解的题目,数独是解题容易出题难...


怎么才能生成只有一个解的数独呢?

目前的零散联想:
1、图的连通性,隐隐约约有点意思。
2、判断逻辑推理是否成立的冗余性,推理的真命题什么的。
3、最笨的办法,自己出题,自己试着穷举解,有多于一个解时,再加一个数,直到只有唯一解为止。


我想是不是可以弄出一个N元一次方程,比较容易看出的是每行每列,每个小九宫的数字和等于45,然后每个数字都属于1~9,
然后看这个方程是不是有唯一解,不过没仔细考虑这个是不是与原题等价,估计还要加其他约束条件.

不过及时把唯一性的弄出来了,这个数独难度的控制似乎也不好办.
0 请登录后投票
   发表时间:2007-06-25  
Readonly 写道
数独的规则是要求只能有一个唯一解,老庄,Eastsun的筛法和raimundox的amb法,都是用随机数来产生,可能会产生多个解的题目,数独是解题容易出题难...

好象更严格的说法是不止只有一个解,而且每一步解法都要能靠逻辑推出来(也就是每一步盘面上至少可以找到一个确定的数字)而不用被迫靠猜的。。。
0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics