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

お絵かきロジックをプログラムで解く


  お絵かきロジックをプログラムで解く 山中和義 2008/05/16 18:59:24  (修正1回)
  つづき 山中和義 2008/05/16 19:00:30  (修正1回)
  │└つづき 山中和義 2008/05/16 19:02:01  (修正1回)
Re: つづき  返事を書く  ノートメニュー
山中和義 <drdlxujciw> 2008/05/16 19:02:01 ** この記事は1回修正されてます
つづき

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
  │ └つづき 山中和義 2008/05/16 19:02:55  (修正1回)
  イラストロジックが簡単に解ける! 片山博文MZ 2008/08/04 13:10:07 

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