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

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


  パズル「数独」(ヒントつきプレイモード) 山中和義 2008/05/09 19:06:15  (修正1回)
パズル「数独」(ヒントつきプレイモード)  返事を書く  ノートメニュー
山中和義 <drdlxujciw> 2008/05/09 19:06:15 ** この記事は1回修正されてます
!確定/未確定:マスを左クリックすると、プロンプト画面が表示される。
! 確定へ:候補の数字を入力
! 未確定へ:0を入力
! キャンセル:Enterのみ入力
!終了:右クリック


!SET bitmap SIZE 501,501

SET WINDOW 0,11,11,0 !表示領域
SET TEXT JUSTIFY "center","half" !配置基準

DIM m(9,9)
RESTORE 10
MAT READ m !データの読み込み


DO
mouse poll mx,my,left,right

LET ix=INT(mx) !マスに換算する
LET iy=INT(my)

SET DRAW mode hidden !ちらつき防止の開始
CLEAR


!解法2:数字の入る「場所の候補」に着目する
DIM m4(9,9)
FOR k=1 TO 9
MAT m4=ZER

FOR x=1 TO 9 !排他的領域を得る
FOR y=1 TO 9
IF m(y,x)<>0 THEN LET m4(y,x)=k !候補から削除する

IF ABS(m(y,x))=k THEN !同じ数字は、列と行とブロックには入らない
FOR yy=1 TO 9 !列
LET m4(yy,x)=k !候補から削除する
NEXT yy
FOR xx=1 TO 9 !行
LET m4(y,xx)=k
NEXT xx
LET Bx=ToBlock(x) !ブロック
LET By=ToBlock(y)
FOR xx=1 TO 3
FOR yy=1 TO 3
LET m4(By+yy,Bx+xx)=k
NEXT yy
NEXT xx
END IF
NEXT y
NEXT x

!MAT PRINT USING "## ## ## ## ## ## ## ## ##": m4 !debug
!PRINT !debug

FOR x=1 TO 9 !列
LET c=9 !その個数
FOR y=1 TO 9
IF m4(y,x)>0 THEN LET c=c-1 ELSE LET yy=y
NEXT y
IF c=1 THEN CALL box(x,yy,k) !※列、行、ブロックで1つの場合は、確定可能である
NEXT x

FOR y=1 TO 9 !行
LET c=9 !その個数
FOR x=1 TO 9
IF m4(y,x)>0 THEN LET c=c-1 ELSE LET xx=x
NEXT x
IF c=1 THEN CALL box(xx,y,k) !※列、行、ブロックで1つの場合は、確定可能である
NEXT y

FOR x=1 TO 3 !ブロック
FOR y=1 TO 3
LET c=9 !その個数
FOR i=1 TO 3
FOR j=1 TO 3
LET y1=(y-1)*3+j
LET x1=(x-1)*3+i
IF m4(y1,x1)>0 THEN
LET c=c-1
ELSE
LET xx=x1
LET yy=y1
END IF
NEXT j
NEXT i
IF c=1 THEN CALL box(xx,yy,k) !※列、行、ブロックで1つの場合は、確定可能である
NEXT y
NEXT x

NEXT k
  つづき 山中和義 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回)
   └数独を解く!数独ソルバー 片山博文MZ 2008/08/04 13:11:52 

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