|
> No.3507[元記事へ]
永野護さんへのお返事です。
> private bool 判定(int ix,int iy) //ナンプレ条件の判定(行と列のみ判定)
> { int i,j;int x=tb[ix,iy];
> for(i=0;i<9;i++) if (ix !=i && x==tb[i,iy]) return (false);
> for(i=0;i<9;i++) if (iy !=i && x==tb[ix,i]) return (false);
> return numpre(); // ここが再帰的になる
> }
>
>
> private bool numpre()
> { int i,j,k;
> for (i=0;i<9;i++)
> for (j=0;j<9;j++)
> if (tb[i,j]==0)
> { for (k=1;k<10;k++)
> {tb[i,j]=k;
> if (判定(i,j)) return true;
> }
> tb[i,j]=0; return false;
> }
> return true;
> }
PUBLIC NUMERIC FALSE,TRUE !システム定数
LET FALSE=0
LET TRUE=-1
DATA 0,7,0, 0,0,0, 0,0,5 !難問
DATA 0,0,6, 0,2,0, 0,0,0
DATA 0,9,0, 1,0,0, 3,0,0
DATA 0,0,0, 0,0,4, 0,0,2
DATA 0,8,0, 0,0,0, 0,1,0
DATA 5,0,0, 3,0,0, 0,0,0
DATA 0,0,4, 0,0,7, 0,6,0
DATA 0,0,0, 0,8,0, 1,0,0
DATA 2,0,0, 0,0,0, 0,9,0
PUBLIC NUMERIC tb(0 TO 8, 0 TO 8)
MAT READ tb
LET dummy=numpre(dummy)
END
EXTERNAL FUNCTION check(ix,iy) !ナンプレ条件の判定
LET x=tb(ix,iy)
FOR i=0 TO 8 !行
IF ix<>i AND x=tb(i,iy) THEN
LET check=FALSE
EXIT FUNCTION
END IF
NEXT i
FOR i=0 TO 8 !列
IF iy<>i AND x=tb(ix,i) THEN
LET check=FALSE
EXIT FUNCTION
END IF
NEXT i
LET bx=INT(ix/3)*3 !ブロック
LET by=INT(iy/3)*3
FOR i=0 TO 2
FOR J=0 TO 2
IF (ix<>bx+i OR iy<>by+J) AND x=tb(bx+i,by+J) THEN
LET check=FALSE
EXIT FUNCTION
END IF
NEXT J
NEXT i
LET check=numpre(dummy) !ここが再帰的になる
END FUNCTION
EXTERNAL FUNCTION numpre(dummy)
FOR i=0 TO 8 !9×9
FOR J=0 TO 8
IF tb(i,J)=0 THEN !未定義なら
FOR k=1 TO 9 !1から9までの数を置いてみる
LET tb(i,J)=k
IF check(i,J)<>FALSE THEN !この数でよいなら
LET numpre=TRUE
EXIT FUNCTION
END IF
NEXT k
LET tb(i,J)=0 !元に戻す
LET numpre=FALSE
EXIT FUNCTION
END IF
NEXT J
NEXT i
MAT PRINT tb; !結果を表示する
LET numpre=TRUE
END FUNCTION
|
|