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

箱入り娘をプログラムで解く


  箱入り娘をプログラムで解く 山中和義 2008/06/15 19:17:14 
  つづき 山中和義 2008/06/15 19:18:29 
Re: 箱入り娘をプログラムで解く  返事を書く  ノートメニュー
山中和義 <drdlxujciw> 2008/06/15 19:18:29
つづき


CALL move_piece(M,N,b$(i), shp, xn,x$) !一手進める

FOR k=1 TO xn !すべての候補について

CALL normalize_board(M,N,x$(k), shp, xx$) !正規化

!FOR j=1 TO tail !既存の局面かどうか確認する
FOR j=head(Lvl(i)-1) TO tail !既存の局面(i-1,i,i+1手)かどうか確認する
IF xx$=c$(j) THEN EXIT FOR
NEXT j
IF j>tail THEN !新規なら追加する
LET tail=tail+1

LET c$(tail)=xx$ !正規化した局面
LET b$(tail)=x$(k) !局面
LET Lvl(tail)=Lvl(i)+1 !手数
LET BNo(tail)=i !1つ前 ※解をたどるため
END IF

NEXT k

END IF


IF Lvl(i)>iLvl THEN !先頭位置を記録する
LET iLvl=Lvl(i)
LET head(iLvl)=i
END IF


LET i=i+1 !次へ
LOOP WHILE i<=tail !すべての局面を探索したら

PRINT tail !debug


PRINT "計算時間=";TIME-t0

PRINT "終了!"


SUB move_piece(M,N,b$, shp(), xn,x$()) !駒を1マス移動させる
LET xn=0 !手の数

FOR j=1 TO PIECE_SIZE !すべての駒について
IF j>9 THEN LET t$=CHR$(j-10+ORD("A")) ELSE LET t$=STR$(j)
FOR k=1 TO M*N !配置位置を得る
IF t$=b$(k:k) THEN EXIT FOR
NEXT k

LET col=MOD(k,N) !行と列の位置を得る
LET row=INT((k-1)/N)

SELECT CASE shp(j) !駒の形状に応じて
CASE 1 !1x1
IF col<>0 THEN !右端以外なら、右
IF b$(k+1:k+1)="0" THEN
LET xn=xn+1
LET x$(xn)=b$
LET x$(xn)(k+1:k+1)=b$(k:k) !swap it
LET x$(xn)(k:k)="0"
END IF
END IF
IF row>0 THEN !上端以外なら、上
IF b$(k-N:k-N)="0" THEN
LET xn=xn+1
LET x$(xn)=b$
LET x$(xn)(k-N:k-N)=b$(k:k)
LET x$(xn)(k:k)="0"
END IF
END IF
IF col<>1 THEN !左端以外なら、左
IF b$(k-1:k-1)="0" THEN
LET xn=xn+1
LET x$(xn)=b$
LET x$(xn)(k-1:k-1)=b$(k:k)
LET x$(xn)(k:k)="0"
END IF
END IF
IF row<M-1 THEN !下端以外なら、下
IF b$(k+N:k+N)="0" THEN
LET xn=xn+1
LET x$(xn)=b$
LET x$(xn)(k+N:k+N)=b$(k:k)
LET x$(xn)(k:k)="0"
END IF
END IF

   └つづき 山中和義 2008/06/15 19:21:16 
    └つづき 山中和義 2008/06/15 19:21:54 

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