!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
|