つづき
EXTERNAL SUB thinking(M,N,num(,),cnt(),spc(), mtx$(), rc) !手を進める DIM w(MAX(M,N)) !ビット列の候補 DO LET chg=1 !盤面の変化フラグ FOR k=1 TO M+N !行と列を走査する !!!PRINT "k=";k IF k>M THEN !列の場合 FOR i=1 TO M !列方向に換算する LET ptn$(i:i)=mtx$(i)(k-M:k-M) NEXT i LET mn=M ELSE !行の場合 LET ptn$=mtx$(k) LET mn=N END IF LET wn=0 !候補の数 MAT w=ZER CALL GenPtn(ptn$,mn, num,k,cnt(k),"",spc(k), w,wn) !候補の生成 IF wn<=0 THEN !※矛盾(候補なし) IF k>M THEN PRINT "列=";k-M ELSE PRINT "行=";k LET rc=1 EXIT SUB END IF LET t$="" !出現頻度からビットを確定する FOR i=1 TO mn IF w(i)=0 THEN !すべてが0の場合 LET t$=t$&"0" ELSEIF w(i)=wn THEN !すべてが1の場合 LET t$=t$&"1" ELSE !変動する場合 ※1〜個数-1 LET t$=t$&"x" END IF NEXT i !!!PRINT ptn$ !!!PRINT t$; wn !確定ビット、候補の数 IF t$(1:mn)<>ptn$(1:mn) THEN !進展があれば置き換える IF k>M THEN !列の場合 FOR i=1 TO M !行方向に換算する LET mtx$(i)(k-M:k-M)=t$(i:i) NEXT i ELSE !行の場合 LET mtx$(k)=t$ END IF LET chg=0 END IF NEXT k LET fin=1 !終了フラグ PRINT FOR i=1 TO M !完成度を確認しながら、絵を表示する FOR j=1 TO N SELECT CASE mtx$(i)(j:j) !ビット列に応じて CASE "0" !白 PRINT "□"; !"×" CASE "1" !黒 PRINT "■"; CASE ELSE !未定 PRINT "×"; !" " LET fin=0 !未定箇所あり END SELECT NEXT j PRINT NEXT i IF fin=1 THEN EXIT DO !すべて確定なら IF chg=1 THEN !※手詰り(変化なし) LET rc=2 EXIT SUB END IF LOOP LET rc=0 !※完成 END SUB
|