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

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


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


LET BUFFER_SIZE=30000 !バッファの大きさ ※

LET M=5 !行 ※盤の大きさ
LET N=4 !列

LET PIECE_SIZE=10 !駒の数 ※
!LET PIECE_SIZE=11 !駒の数 ※

!技術メモ
! 0:空き
! 1:1x1
! 2:1x2(横長)
! 3:2x1(縦長)
! 4:2x2(娘)
!駒= 0,1,2,3,4,5,6,7,8,9,A,B
DATA 0,3,3,3,3,2,1,1,1,1,4 !駒との対応 ※
!DATA 0,3,3,3,3,1,1,1,1,1,1,4 !駒との対応 ※

DATA "1AA2" !盤の初期配置 ※
DATA "1AA2"
DATA "3554"
DATA "3674"
DATA "8009"
!DATA "1BB2" !盤の初期配置 ※
!DATA "1BB2"
!DATA "3564"
!DATA "3784"
!DATA "900A"
!------------------------------ ここまでがデータ


DIM shp(0 TO PIECE_SIZE) !駒の型番
MAT READ shp

DIM b$(BUFFER_SIZE) !局面
LET b$(1)=""
FOR j=1 TO M
READ xx$
LET b$(1)=b$(1)&xx$
NEXT j

DIM c$(BUFFER_SIZE) !正規化した局面
CALL normalize_board(M,N,b$(1), shp, c$(1))

DIM Lvl(BUFFER_SIZE) !手数
MAT Lvl=ZER
DIM BNo(BUFFER_SIZE) !1つ前の局面番号
MAT BNo=ZER

DIM x$(8) !次の局面の候補

LET tail=1 !局面の追加位置(末尾)

LET minLvl=200 !最小手数(仮) ※
DIM head(-1 TO minLvl) !i番目の手のバッファ上での先頭位置
LET head(-1)=1 !-1手 ※番兵
LET head(0)=1 !0手
LET iLvl=0


LET t0=TIME

LET i=1 !展開中の局面
DO
!!!PRINT "No.";i;"(";Lvl(i);"手 ";Bno(i);"から)" !debug
!!!CALL display_board(M,N,b$(i)) !debug

IF c$(i)(18:19)="44" THEN !クリアなら
!IF c$(i)(14:15)="44" AND c$(i)(18:19)="44" THEN !クリアなら
IF Lvl(i)>minLvl THEN EXIT DO
LET minLvl=Lvl(i) !最小手数を記録する

CALL display_answer(i, Lvl,Bno, M,N,b$)

ELSE

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

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