パーソナルブログメモリ

a = [1, 1]
for _ in "*" * 999: a += [sum(a[-2:])]
print(a)

プチコン3号講座 迷路を解くプログラム

2015-09-01 | プチコン3、4、BIG
第14回 今回は再帰関数を使って迷路を解いてみます。

<配列変数>
 MZ$[Y] 迷路の一行ごとのデータ
 AN[X,Y] 迷路の最短距離
 LX[N],LY[N] スタート位置からゴールN歩目の座標

<グローバル変数>
 GX,GY ゴールの座標
 LS ゴールできる場合の歩数

<関数>
 NEXTS 指定座標の周りに一歩踏み出して再度同じ関数を呼び出す
  SX,SY 指定座標
  SN   現在の歩数
  GX,GYに来た時はLSに現在の歩数を設定、その後呼ばれた際はLSが0以上なら何もしないで帰る
 
 CHK 指定座標までの最短歩数を更新していて壁でなければTRUEを返す
  X,Y 指定座標
  C 最短歩数

再帰関数強力です。詰め込みましたが1画面で収まるとは…


当初、ゴールまでの最短を計算していたのですが、
経路表示のアルゴリズムを入れる際にゴールできたら再帰を終了させる処理を入れてしまったため

ソースの迷路を変更したところ、最短にはなっていませんでした。





さっそく、上記プログラムを修正してみました。
ゴールに到達した際に最短の経路を保持する配列の追加です。

<配列変数> 追加
 BX[N],BY[N] スタート位置からゴールN歩目の座標 最短の保持

<グローバル変数> 追加
 BL ゴールできる場合の最小の歩数 初期値1000

<関数> 修正
 NEXTS 指定座標の周りに一歩踏み出して再度同じ関数を呼び出す
  SX,SY 指定座標
  SN   現在の歩数
  GX,GYに来た時はLSに現在の歩数を設定、その後呼ばれた際はLSが0以上なら何もしないで帰る
  LSが最小値ならBLに歩数を入れ、配列LXをBXに LYをBYにコピー

配列のコピーで、1画面は無理だろうと考えていたのですが
COPY A,Bで配列Bを配列Aにコピーするという命令のおかげで収まりました。




最新の画像もっと見る

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。