つづき
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
|