新しく発言する  EXIT  インデックスへ

パズル「数独」(ヒントつきプレイモード)


  パズル「数独」(ヒントつきプレイモード) 山中和義 2008/05/09 19:06:15  (修正1回)
  つづき 山中和義 2008/05/09 19:07:12  (修正1回)
  │└つづき 山中和義 2008/05/09 19:08:40  (修正1回)
  │ └つづき 山中和義 2008/05/11 20:53:30 
  !9×9数独をプログラムで解く 山中和義 2008/05/12 13:57:38  (修正1回)
Re: パズル「数独」(ヒントつきプレイモード)  返事を書く  ノートメニュー
山中和義 <drdlxujciw> 2008/05/12 13:57:38 ** この記事は1回修正されてます
!9×9数独をプログラムで解く

DIM m(0 TO 8,0 TO 8)
MAT READ m !問題を読み込む

LET t0=TIME
CALL BackTrack(m,0) !左上から ※左上からの連番
PRINT "計算時間=";TIME-t0


DATA 0,0,4, 0,0,0, 0,5,0 !初期データ
DATA 0,0,8, 0,0,0, 2,0,9
DATA 0,0,3, 0,0,4, 0,0,0

DATA 0,0,0, 0,2,0, 3,8,7
DATA 0,0,0, 5,0,7, 0,0,0
DATA 7,4,6, 0,3,0, 0,0,0

DATA 0,0,0, 2,0,0, 4,0,0
DATA 3,0,7, 0,0,0, 9,0,0
DATA 0,9,0, 0,0,0, 5,0,0

END


EXTERNAL SUB BackTrack(m(,),p) !位置pを調査する
IF p<9*9 THEN !すべてが埋まるまで
LET row=INT(p/9) !行と列に換算する
LET col=MOD(p,9)
IF m(row,col)<>0 THEN !数字があれば
CALL BackTrack(m,p+1) !次へ
ELSE !なけらば
FOR k=1 TO 9 !数字1〜9を
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 !すべて埋まったら
MAT PRINT USING "# # # # # # # # #": m !解を表示する
PRINT
END IF
END SUB


EXTERNAL FUNCTION CheckRule(m(,), row,col,k) !同じ数があるかどうか確認する
LET CheckRule=0
FOR y=0 TO 8 !列
IF m(y,col)=k THEN EXIT FUNCTION !見つかったので、NG!
NEXT y

FOR x=0 TO 8 !行
IF m(row,x)=k THEN EXIT FUNCTION
NEXT x

LET Bx=INT(col/3)*3 !ブロック
LET By=INT(row/3)*3
FOR x=0 TO 2
FOR y=0 TO 2
IF m(By+y,Bx+x)=k THEN EXIT FUNCTION
NEXT y
NEXT x

LET CheckRule=1 !見つからないので、OK!
END FUNCTION
   └数独を解く!数独ソルバー 片山博文MZ 2008/08/04 13:11:52 

 インデックスへ  EXIT
新規発言を反映させるにはブラウザの更新ボタンを押してください。