楼主: newkid

用PLSQL解数独(SUDOKU)

[复制链接]
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
61#
发表于 2010-4-3 22:43 | 只看该作者
12568246845834572469346
4573461459215914674678
24782789613413852347134
24782785316712694678146
4791345798569467345672
6278923812579157941783578135
3256892682457894567925689246814569
2589412589356923568926825687
2589256897124589145691256893245684569

这是程序中间输出的结果的最后一步
格子里单一个数字的,说明该格的值已经确定
格子里多个数字的,说该格子的值还未确定,所列数字为可能的值

下表是去掉未知值后的

1    7 9 
 3  2   8
  96  5  
  53  9  
 1  8   2
6    4   
3      1 
 41     7
  7   3  


[ 本帖最后由 lastwinner 于 2010-4-3 23:01 编辑 ]

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
62#
发表于 2010-4-3 23:12 | 只看该作者
粗略看了一下
2行7列的1是可以确定的,但这是通过关联分析才确定的
我的算法只是针对单个单元格做分析处理
所以,通过关联单元格的分析才能确定的格子,在当前我们讨论的程序是无法实现的


ps:我直觉没觉得这个有唯一解……

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
63#
 楼主| 发表于 2010-4-4 08:36 | 只看该作者
原帖由 lastwinner 于 2010-4-3 23:12 发表
粗略看了一下
2行7列的1是可以确定的,但这是通过关联分析才确定的
我的算法只是针对单个单元格做分析处理
所以,通过关联单元格的分析才能确定的格子,在当前我们讨论的程序是无法实现的


ps:我直觉没觉得这个有唯一解……


你这2行7列是怎么推出来的,为什么是1?
我自己的程序和#45的SQL(他用的可是穷尽法,所有可能都试了)结果都是:
162857493
534129678
789643521
475312986
913586742
628794135
356478219
241935867
897261354

如果你还有其他解请列出来。

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
64#
发表于 2010-4-4 12:50 | 只看该作者

回复 #63 newkid 的帖子

看错了,哈哈
2行第三个方阵,看成只有最右边一列包含1了,所以想当然的就认为该方阵的1必然在这一列
于是乎,本列上其他地方都不应该出现1,然后得出结论


我blog上的评论中也写到
对于有多个解的,需要进行尝试,这个尝试需要用递归算法去实现
(现在看来,对于这种有关联约束的,也适用)


未知的数太多,无法人工一一去尝试
尽管我的程序当发现有矛盾的时候,会在控制台会输出error信息,但这样做工作量太大了
脑子也记不住在什么时候改过什么数字,更不要说回溯了

尝试的算法大致如下:
在我的程序(记为P)得出的结果上,假如有N个格子的值是未确定的

1、取其中一个格子N1,赋予该格子的可能值中的一个N1V1
2、然后继续调用P计算
3、若计算结果出现error,则
   3.1 判断N1的可能值是不是都已经尝试过?如果是,那是不是最后都导致error?如果是都导致error,转3.1.1,如果不是都导致error,则不做任何处理
           3.1.1 则返回上一层,表明上一层确定的值在接下来的推算过程中会导致error,因而必须换成其他的值
   3.2 N1的值还未都尝试过,赋予N1的下一个可能值,例如N1V2,然后转2
4、若计算结果未出现error,则类似1,取格子N2,赋予N2V1,然后转2

中间还需要一些分支判断,例如是不是所有的格子的值都已经尝试过,然后根据P的计算结果,若未出现error,则OK,该尝试为一个结果,然后接着回溯,做其他的尝试

还有一点,如果只是单纯的做尝试,则在尝试过程中,可能会出现一些重复尝试
需要一个算法来避免这种浪费时间的现象出现
例如N1的可能值是4、6,N2的可能值是4、6,他们同在一行/列/方阵中
若确定了N1的值为4,则N2的值必为6,假若此假设会导致出现error,那到给N2设值的时候,就不要尝试给设6了,因为之前已经证明这种假设最终会导致error出现
当然,就我举的这个例子,是不会出现再给N2赋值6的情况的

也许我这个担心是多余的
未细想,就这多了……

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
65#
 楼主| 发表于 2010-4-7 04:20 | 只看该作者

在消除法的基础上加入回溯的功能,代码一下子膨胀了很多,因为要保存、恢复被删除的数据。
我的尝试方法是:找出第一个未确定位置的值,逐个位置尝试。因为这个顺序的关系,如果一个小值的正确位置是在右下方,则前面必然有很多失败的尝试。不知道有什么优化的办法没有。

CREATE OR REPLACE PROCEDURE sudoku_lw3(p_str IN VARCHAR2 DEFAULT NULL)
AS
   TYPE t_num IS TABLE OF NUMBER;

   TYPE t2_num IS TABLE OF t_num INDEX BY BINARY_INTEGER;
   TYPE t3_num IS TABLE OF t2_num INDEX BY BINARY_INTEGER;
   
   TYPE t_str IS TABLE OF VARCHAR2(100) INDEX BY BINARY_INTEGER;

   s t_str;      ---- 字符串数组,存放题目

   e t_num := t_num(1,2,3,4,5,6,7,8,9);
   c t2_num;   ---------- 如果c(ij)(k)有数据,则表示数字i可能出现在第j行第k列
               ----- 如果下标为三位数,c(i0j)(k)有数据,则表示数字i可能出现在第k行第j列      
               ----- 如果下标为四位数,c(i00j)(k)有数据,则表示数字i可能出现在第k区第k列个位置
               ----- 从左到右、从上到下编为9个区,每个区里面又按同样顺序编1-9号            
   
   bak t3_num; ----- 存放被删除的c()()值。第三维是个堆栈
   
   get_a t2_num ;       ------ 存放行列坐标和区号的换算,第i行第j列对应的区号是 get_a(i)(j)
   get_a_num t2_num ;   ------ 存放行列坐标和区内位置号的换算,第i行第j列对应的区内位置编号是 get_a_num(i)(j)
   
   lv_ptr NUMBER;
   lv_bak_ptr NUMBER;
   
   gv_bad_answer BOOLEAN;
   
   PROCEDURE save_bak(i NUMBER, p_deleted_by NUMBER)    ---- 用消除法删去一个值之前把数据备份
   AS
   BEGIN
       IF p_deleted_by>0 AND c.EXISTS(i) AND NOT (bak.EXISTS(p_deleted_by) AND bak(p_deleted_by).EXISTS(i)) THEN
          bak(p_deleted_by)(i) := c(i);
       END IF;
   END save_bak;
   
   PROCEDURE del_num (i NUMBER, j NUMBER, p_deleted_by NUMBER DEFAULT NULL)  
   --- 删去c(i)第j个元素, 如果p_deleted_by>0表示正在尝试,需要把删除之前的数据保存备份
   AS
   BEGIN
      IF NOT c.EXISTS(i) OR gv_bad_answer THEN
         RETURN;
      END IF;
      
      IF j IS NULL THEN
         save_bak(i,p_deleted_by);
         c.DELETE(i);
      ELSE
         save_bak(i,p_deleted_by);
         c(i).DELETE(j);
         IF c(i).COUNT=0 THEN     ----- 全部删光了,说明这个尝试是失败的
            gv_bad_answer := TRUE;
         END IF;
      END IF;
   END del_num;
   
   PROCEDURE known (       ----- 消除法,已知值p_val出现在p_row行和p_col列,把它从行、列、区的候选值清单中删除。
             p_row        IN NUMBER
            ,p_col        IN NUMBER
            ,p_val        IN NUMBER
            ,p_deleted_by IN NUMBER DEFAULT NULL
             )
   AS
   BEGIN  
      del_num(p_val*10+p_row                ,NULL,p_deleted_by);     ----- 本行已经不可能出现p_val了
      del_num(p_val*100+p_col               ,NULL,p_deleted_by);     ----- 本列已经不可能出现p_val了
      del_num(p_val*1000+get_a(p_row)(p_col),NULL,p_deleted_by);     ----- 本区已经不可能出现p_val了
      
      IF gv_bad_answer THEN
         RETURN;
      END IF;
      
      FOR i IN 1..9 LOOP
          del_num(i*10+p_row,p_col ,p_deleted_by);        ----- 所有其他候选值都不会出现在p_row,p_col 这个坐标了
          del_num(i*100+p_col,p_row,p_deleted_by);
          del_num(i*1000+get_a(p_row)(p_col),get_a_num(p_row)(p_col),p_deleted_by);

          del_num(p_val*10+i,p_col,p_deleted_by);        ------ p_val不会出现在同一列的其他行了
          del_num(p_val*100+i,p_row,p_deleted_by);       ------ p_val不会出现在同一行的其他列了

          FOR j IN 1..9 LOOP     ------ 所有区中只要行,列和本坐标有交叉,也就不会出现p_val了
              del_num(p_val*1000+get_a(p_row)(j),get_a_num(p_row)(j),p_deleted_by);
              del_num(p_val*1000+get_a(j)(p_col),get_a_num(j)(p_col),p_deleted_by);
              
          END LOOP;

          IF gv_bad_answer THEN
             RETURN;
          END IF;

      END LOOP;
      
      s(p_row) := SUBSTR(s(p_row),1,p_col-1)||p_val||SUBSTR(s(p_row),p_col+1); ---- 把已知值拼到方阵中
   END known;

   PROCEDURE del_known (     ------ 从c(p_ptr)里面取出第一个未删的位置,假设这是一个正确的位置,用消除法推理删除其他的
             p_ptr        IN NUMBER
            ,p_deleted_by IN NUMBER
             )
   AS
      lv_row  NUMBER;
      lv_col  NUMBER;
      lv_val  NUMBER := SUBSTR(p_ptr,1,1);
      lv_deleted_by NUMBER := p_deleted_by;
   BEGIN
      CASE
      WHEN p_ptr>1000 THEN
           lv_row := get_a(SUBSTR(p_ptr,4))(c(p_ptr).FIRST);
           lv_col := get_a_num(SUBSTR(p_ptr,4))(c(p_ptr).FIRST);
      WHEN p_ptr>100 THEN
           lv_row := c(p_ptr)(c(p_ptr).FIRST);
           lv_col := SUBSTR(p_ptr,3);  
      ELSE
           lv_row := SUBSTR(p_ptr,2);
           lv_col := c(p_ptr)(c(p_ptr).FIRST);
      END CASE;
      
      IF p_deleted_by=-1 THEN    ----- p_deleted_by=-1表示这是新一轮消除的尝试
         lv_deleted_by := bak.COUNT+1;   --- 获取一个新堆栈位置来存放被删除的数据
         
         ---- 当前尝试值保存到当前栈顶
         save_bak(lv_val*10+lv_row,bak.COUNT);
         save_bak(lv_val*100+lv_col,bak.COUNT);
         save_bak(lv_val*1000+get_a(lv_row)(lv_col),bak.COUNT);
         
         ---- 在尝试当前值之前把它们删掉。如果中间失败,回溯并恢复出来的数组将不再包含这个当前值,将会从下一个开始
         ---- 如果从当前值以后的猜测值全部失败,则回溯到刚才保存在栈顶的状态
         IF c.EXISTS(lv_val*10+lv_row) THEN
            c(lv_val*10+lv_row).DELETE(lv_col);
         END IF;
         IF c.EXISTS(lv_val*100+lv_col) THEN
            c(lv_val*100+lv_col).DELETE(lv_row);
         END IF;
         IF c.EXISTS(lv_val*1000+get_a(lv_row)(lv_col)) THEN
            c(lv_val*1000+get_a(lv_row)(lv_col)).DELETE(get_a_num(lv_row)(lv_col));
         END IF;
      END IF;
      
      known(lv_row,lv_col,lv_val,lv_deleted_by);    ---- 运用消除法
      RETURN;
  END del_known;

   PROCEDURE check_known(p_deleted_by IN NUMBER DEFAULT NULL) ---- 试图用推理的办法找出所有已知数字
   AS
      v_continue NUMBER := 1;
      lv_ptr NUMBER;
   BEGIN
      
      WHILE v_continue=1 AND NOT gv_bad_answer LOOP
            v_continue := 0;   
            lv_ptr := c.FIRST;
            WHILE lv_ptr>0 AND NOT gv_bad_answer LOOP
                  IF c(lv_ptr).COUNT=1 THEN       ------- lastwinner 的第四步推理: 只剩下一个位置可选,则该位置可确定  
                     v_continue := 1;
                     del_known(lv_ptr,p_deleted_by);
                  END IF;
                  
                  lv_ptr := c.NEXT(lv_ptr);
            END LOOP;
      END LOOP;
   END check_known;
   
BEGIN
   gv_bad_answer := FALSE;

   --- 测试例子
   s(1):= '1    7 9 ' ;
   s(2):= ' 3  2   8' ;
   s(3):= '  96  5  ' ;
   s(4):= '  53  9  ' ;
   s(5):= ' 1  8   2' ;
   s(6):= '6    4   ' ;
   s(7):= '3      1 ' ;
   s(8):= ' 4      7' ;
   s(9):= '  7   3  ' ;

   FOR i IN 1..9 LOOP
       get_a(i) := e;   ----- 初始化,真正的值在下面计算
       get_a_num(i) := e;
       FOR j IN 1..9 LOOP
           get_a(i)(j) := (CEIL(i/3)-1)*3+CEIL(j/3);           ----- 预先算好行列坐标和区以及区内编号的对应关系并保存到数组中
           get_a_num(i)(j) :=  (MOD(i-1,3)+1 -1 )*3 + MOD(j-1,3)+1;
           
           c(i*10+j) := e;
           c(i*100+j) := e;
           c(i*1000+j) := e;
       END LOOP;
   END LOOP;
   
   FOR i IN 1..9 LOOP
       IF p_str IS NOT NULL THEN
          s(i):= SUBSTR(p_str,(i-1)*9+1,9);
       END IF;
       FOR j IN 1..9 LOOP
           IF SUBSTR(s(i),j,1) BETWEEN '1' AND '9' THEN
              known(i,j,SUBSTR(s(i),j,1));    ----- 题目提供的已知值
           END IF;
       END LOOP;
              
   END LOOP;
   
   check_known;  ---- 所有已知值消除完毕,试图推理

   IF NOT gv_bad_answer THEN

      WHILE c.COUNT>0 LOOP    --------- 还有未知值
            lv_ptr := c.FIRST;
      
            IF c(lv_ptr).COUNT>0 THEN
               del_known(lv_ptr,-1);    ---- 取出第一个未知值来尝试
               check_known(bak.COUNT);
            ELSE
               gv_bad_answer := TRUE;
            END IF;

            IF gv_bad_answer THEN     ------ 测试失败,从bak()中恢复
               lv_bak_ptr := bak.COUNT;  ---- 出栈

               IF lv_bak_ptr>0 THEN
                  lv_ptr := bak(lv_bak_ptr).FIRST;
                  WHILE lv_ptr>0 LOOP
                        c(lv_ptr) := bak(lv_bak_ptr)(lv_ptr);      --- 从bak()中恢复到c()
                        lv_ptr := bak(lv_bak_ptr).NEXT(lv_ptr);
                  END LOOP;
              
                  bak.DELETE(lv_bak_ptr);  ---- 恢复完毕,栈顶削掉,继续下一轮尝试
                  gv_bad_answer := FALSE;

               ELSE
                  EXIT;
               END IF;
            END IF;
      END LOOP;
   END IF;
   
   IF gv_bad_answer THEN
      RAISE_APPLICATION_ERROR(-20001,'no answer found');
   ELSE
      DBMS_OUTPUT.PUT_LINE('Answer Found:');
      FOR i IN 1..9 LOOP  ------ 输出答案
          DBMS_OUTPUT.PUT_LINE(s(i));
      END LOOP;
   END IF;
END sudoku_lw3;
/

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
66#
发表于 2010-4-12 13:27 | 只看该作者
javascript

sudoku.js.rar

7.96 KB, 下载次数: 30

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
67#
发表于 2010-4-12 13:32 | 只看该作者
[解法举例]
先注意其中一个方格,限定该方格内可以填写的数字。
注意其中一列(或者其中一个小九宫格),寻找填写某数字的方格。
学过“资料结构”的人,可以尝试用Backtrack试试。
数独的通解方法及步骤:

根据以下方法可以确保最终得到数独的解,而且通过手工运算的时间基本可以控制在1.5个小时,不论难易程度,所以此方法可以作为取得数独答案的一般解法。
1、根据横列、竖列和方格的限制条件排除各个点不可能的数字,并从1-9将各个可能的数字用小字体逐个写进每个空白的格子。(该步骤大约需要15-20分钟,这是求解的初始,务必确保没有遗漏)。

2、审视第一步骤的结果,如果发现某个空格只有一个数字,即确定该空格为这个数字。并根据该数字审视其相关的横列、竖列和方格,并划除相同的数字。(该情况出现的可能往往不多,除了较简单的数独题,但这是一个必要的过程,而且在随后的过程中要反复使用此方法。)

3、审视各个横列、竖列和方格中罗列出的可能的数字结果,若发现某一个数字在各个横列、竖列或方格中出现的次数仅一次,则可以确定该空格的解为此数字。并根据第二条的方法排除与此空格相关列或方格中相同的数字。

4、审视各个横列、竖列和方格中罗列的各个可能的结果,找出相对称的两个数组合的空格(或3个、4个组合),并确定这两个空格(或3个、4个)的数字只可能为这两个数字,即两个数字在这两个空格的位置可以交换,但不可能到该行、该列或该方格的其他位置。根据此结果可以排除相关列或方格罗列出相关数字的可能,并缩小范围。(该步骤处理的难度相对复杂,需要在积累一定经验的基础上进行,也是最终求解的关键)

5、反复使用2、3、4提到的步骤,逐步得到一个一个空格的解,并将先前罗列的各种可能的结果一个一个排除,使可能的范围越来越小,直至得到最后结果。

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
68#
 楼主| 发表于 2010-4-12 22:23 | 只看该作者
第四步推理有点意思。

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
69#
发表于 2010-4-23 00:19 | 只看该作者
原帖由 newkid 于 10-4-12 22:23 发表
第四步推理有点意思。


几年前玩了手机上上百个数独游戏
有此现象的局,貌似全都是在最后才发现的
人力寻找,确实困难较大

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
70#
发表于 2010-4-23 09:02 | 只看该作者
已经提供的数字越多,每9个格中已知的数字越多,越容易

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表