!確定/未確定:マスを左クリックすると、プロンプト画面が表示される。 ! 確定へ:候補の数字を入力 ! 未確定へ: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
|