第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にコピーするという命令のおかげで収まりました。
<配列変数>
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が最小値ならBLに歩数を入れ、配列LXをBXに LYをBYにコピー
配列のコピーで、1画面は無理だろうと考えていたのですが
COPY A,Bで配列Bを配列Aにコピーするという命令のおかげで収まりました。