数独

 投稿者:匿名希望  投稿日:2016年 6月19日(日)16時48分45秒
  現在パソコンで数独の問題を解く場合再帰用法のプログラムを
使っているようです。この場合9×9以外に16×16や25×25
の場合などもすべて完全に解けるのでしょうか。
それとも特殊な場合にのみ解けるのでしょうか。
よろしくお願いします。
 

Re: 数独

 投稿者:しばっち  投稿日:2016年 6月24日(金)22時04分1秒
  > No.4090[元記事へ]

匿名希望さんへのお返事です。

> 現在パソコンで数独の問題を解く場合再帰用法のプログラムを
> 使っているようです。この場合9×9以外に16×16や25×25
> の場合などもすべて完全に解けるのでしょうか。
> それとも特殊な場合にのみ解けるのでしょうか。
> よろしくお願いします。

山中氏のプログラムちょっといじってみました。

PUBLIC NUMERIC N,N1
!'RESTORE 1
RESTORE 2
!'RESTORE 3
READ N1
LET N=N1*N1
DIM M(0 TO N-1,0 TO N-1)
MAT READ M
CALL BACKTRACK(M,0)
1 DATA 3
  DATA 4,1,0,0,0,8,0,7,0
  DATA 0,0,2,0,0,9,1,0,5
  DATA 7,8,9,0,0,0,3,6,4
  DATA 0,0,0,0,4,1,7,0,0
  DATA 1,0,8,0,5,6,0,2,9
  DATA 0,7,0,9,8,0,6,0,0
  DATA 2,0,7,0,0,4,8,0,3
  DATA 0,4,3,0,9,0,2,1,0
  DATA 6,0,0,0,2,0,5,0,7

2 DATA 4
  DATA  1, 0, 2, 0, 0,14, 5,13, 0,10, 0, 0, 0,11, 0, 0
  DATA  0, 0,16, 0, 0, 0, 0, 7, 0,11,14, 6, 0, 0,13,10
  DATA 15,11, 0, 0, 0, 6, 0, 1, 2, 0, 0, 0, 8, 0, 0,12
  DATA  6, 0, 0,12, 0, 0, 0, 8, 4, 0, 7, 9, 0, 0, 0, 3
  DATA  0, 0, 0, 9, 2, 1, 0, 0,12,14, 0, 0, 7, 6, 0, 0
  DATA  5,13, 1, 0, 0, 0,16, 6, 0, 3,15, 4, 0, 8, 0,11
  DATA 10, 2, 0, 0,13, 5, 3, 0, 0, 0, 0, 7, 0,15,16, 0
  DATA  0, 0,15, 0,14, 0, 4,11, 0, 1, 6, 2,10, 0, 0, 0
  DATA 16,10, 0, 0, 8, 7, 0, 0, 0,12, 0, 0, 0, 0, 0, 0
  DATA  0, 0, 0, 0,12, 0,14, 0,13, 0,16, 0, 0, 0, 5, 0
  DATA  0, 7, 6,11, 0,15, 2, 0, 0, 0, 8, 0, 4, 0, 0, 0
  DATA  3,15, 0, 4,11,13, 0, 0, 5, 0, 0, 0, 9, 1, 0, 0
  DATA  0, 1, 0, 2, 0,11, 0, 4, 0, 0,10, 0, 0, 5,14,16
  DATA  0, 0,10, 0, 1,12, 0, 0,14,13, 0,16, 0, 7, 6, 0
  DATA  0, 0,14, 0, 0, 0, 7,10, 9, 0, 0,15, 1, 0, 0, 0
  DATA  0, 6, 0, 8, 0, 0,13, 0, 0, 4, 0, 3, 2, 0, 0,15

3 DATA 5
  DATA 12, 4, 0,16, 0, 0,13, 1,22, 0, 0, 0, 0, 0,17,20,21,14,15, 0,10,19, 0, 0,11
  DATA 21,18,20,22, 7, 9,11, 0,16, 3,15, 0, 0, 1,13,10, 0, 4,24, 0, 8, 0, 0,23, 0
  DATA 14, 1,15, 9, 0, 0,23, 0, 0, 0, 3,18,10, 0, 0, 0, 0, 0, 0, 5, 0,13,16, 0,24
  DATA  0,13,24, 0, 0, 0,21, 4,25, 6, 0, 0,11, 0,22,18,19, 1, 0, 3, 0, 0,0 ,20, 0
  DATA  0, 0,11, 0, 0,18,10, 0,15,19, 0,20,24, 0, 0, 0,13, 0, 0, 0, 1,22, 3,12, 0
  DATA  1,14, 0, 3, 0, 4, 7, 0, 0, 0,13,10, 0,19,20,24,11, 5, 0,21, 0,18,22,17, 0
  DATA  0,20,22,11, 0, 0, 0,16,10, 0, 7,21, 0, 0,23, 0, 1, 9, 0, 0,13, 5, 0,14, 3
  DATA 19,24, 7,23, 0,14, 0,20,11, 5, 0, 0, 0, 0, 0,13,18, 0, 3,22, 0, 1, 0,10, 0
  DATA  0, 0,25, 0, 0,15,19,13, 0,22, 1, 3,18, 0, 0, 0,14, 0,12, 0, 0,23,11,24,20
  DATA 10, 0, 0, 0,13, 0, 6, 3, 1,18,22, 0, 0, 0,24, 0,25, 0, 0,23,19, 0, 7, 2, 0
  DATA 16, 6,19,18, 0, 0,22, 0, 0,24,20,23, 3, 0, 0, 7, 0,11,10, 1, 0, 0,13, 0, 8
  DATA  0, 0,13, 1, 0,10, 3,11,14,20,16, 0, 0, 0,21,19, 9,24,22,18, 0, 0, 0, 0,23
  DATA 15, 0,12, 0,24, 1, 0,23, 0, 7,18,22,13, 0, 0, 0, 0, 0, 4, 0, 3,14,19, 0, 0
  DATA  0, 3, 0, 4, 0, 0, 0,15, 0, 0, 0, 0, 1, 0, 0,14, 0,13, 6, 0,18, 0,24,22,21
  DATA 22, 0, 0,20,14,19,18, 0, 0, 0, 0, 0, 0,24, 0,21, 3, 0, 0, 0,11,10, 1, 0, 0
  DATA 13, 0, 6, 0, 0,23, 5,24, 0,15, 0, 0,20, 0, 0, 0, 0,22,18,11, 0, 0, 0, 3, 1
  DATA 24,11, 5, 0, 3, 0,20,18, 0,13, 0, 1,22,12, 0,15, 0, 0,21, 0, 0, 0, 0, 4,10
  DATA  0,23, 1, 0,18, 0, 0, 0, 0, 0,24, 0, 0, 0, 0, 3, 0,12, 0, 0,22, 0, 0, 0,19
  DATA  0, 0, 0, 7, 0,16, 0,22,19, 0, 0, 0, 0,11, 3, 0,24, 0, 1, 0,20, 0, 0, 0,13
  DATA  4,15, 0, 0,22, 3, 0,21, 0, 1, 0, 0, 0,18, 6, 0,10, 0, 0,20,24, 7,17,11, 0
  DATA  6, 0,21, 0, 0, 0, 0, 0,18,11, 0,14, 0,23, 1, 0,20, 3, 0,19, 0,24, 4, 0,22
  DATA 11, 0,18,13,20, 0, 0, 0,24,14, 0, 0, 0, 3, 0, 1, 0,10, 0, 4, 0, 0, 0,15, 0
  DATA  3,16, 4,24, 0,22, 0, 0, 0, 0, 0,13, 0, 0,10, 0,23,18, 0, 0, 0,21, 0,19,25
  DATA 23, 7, 0, 0, 0,20, 0,10, 3,21, 6,24, 0,22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,18
  DATA  0,22,14, 0, 1,13,15,19,23, 0,11,16, 0,20, 0, 9, 0,21, 0, 0, 0, 3,10, 0,12
END

EXTERNAL SUB BACKTRACK(M(,),P)
  IF P<N*N THEN
     LET ROW=INT(P/N)
     LET COL=MOD(P,N)
     IF M(ROW,COL)<>0 THEN
        CALL BACKTRACK(M,P+1)
     ELSE
        FOR K=1 TO N
           IF CHECKRULE(M,ROW,COL,K)=1 THEN
              LET M(ROW,COL)=K
              CALL BACKTRACK(M,P+1)
              LET M(ROW,COL)=0
           END IF
        NEXT K
     END IF
  ELSE
     FOR I=0 TO N-1
        FOR J=0 TO N-1
           PRINT USING "###":M(I,J);
           IF MOD(J+1,N1)=0 THEN PRINT "|";
        NEXT J
        PRINT
        IF MOD(I+1,N1)=0 THEN PRINT REPEAT$("-",3*N+N1)
     NEXT I
     PRINT
  END IF
END SUB

EXTERNAL FUNCTION CHECKRULE(M(,),ROW,COL,K)
  LET CHECKRULE=0
  FOR Y=0 TO N-1
     IF M(Y,COL)=K THEN EXIT FUNCTION
  NEXT Y
  FOR X=0 TO N-1
     IF M(ROW,X)=K THEN EXIT FUNCTION
  NEXT X
  LET BX=INT(COL/N1)*N1
  LET BY=INT(ROW/N1)*N1
  FOR X=0 TO N1-1
     FOR Y=0 TO N1-1
        IF M(BY+Y,BX+X)=K THEN EXIT FUNCTION
     NEXT Y
  NEXT X
  LET CHECKRULE=1
END FUNCTION
 

数独

 投稿者:匿名希望  投稿日:2016年 6月28日(火)15時33分52秒
  しばっち様、大変参考になりました。ありがとうございます。  

戻る