一画面に詰めていてだいぶ読みにくいので,追って説明
1:画面消去と変数設定
WとHはマップサイズの設定(ここを変えたらマップサイズが変わる)
RBBはリングバッファのサイズ
TOPとBTMはゴミ(単なる消し忘れ)
X,Y,O,P,Iは19行以降で使うので後述
2:マップの設定
問題の通り、4*4のマップの[1,1],[1,2],[2,1]のところに1を書いている(他は0)
なお、MAP[W,W]はMAP[W,H]の間違い(今気づいた)
3:歩数チェック用マップと、それを調べる為のリングバッファの設定
4:方向指定用の配列の宣言
5:その指定
添字の値が0の場合、PX[0]=-1,PY[0]=0になるから「左」
同様に1で「上」、2で「右」、3で「下」
6:命令CHK_BUFの設定
引数は必要なかったが、まあ、汎用性を持たせるために設定しておいた
7:チェック開始の場所が壁ん中なら、何もしないで抜ける
特に意味はないが、エラートラップとして使えるので残しておいた
8:内部変数の設定
TOPは現在処理中のキュー
BTMはバッファの最後尾
1行目のゴミは実はこれ
BはBTMをリングバッファ内での位置に変換したもの
Iは前述の、方向指定配列を利用する時に使う一時変数
CX,CYは次に調べる位置を格納する変数
9:歩数チェック用マップを、「とても大きな数」で埋める
歩数チェック用マップの「調べ始め」の座標に0を書く
10:TOPがBTMより大きくなるまで繰り返す
11:四方をチェックするためのループ
12:次にチェックする方向を示しておく
13:次にチェックする方向がマップからはみ出してなくて、更に
次チェックする方向が壁ではなくて、まだ未踏だったら
次にチェックする場所を記憶し、チェックしたとこを一歩進める
14:11行目に戻る
15:次にチェックする場所を今いる場所とする
16:10行目に戻る
17:CHK_BUF命令終わり
18:先に作った命令CHK_BUFを「問題のA(0,0)」の場所と設定して実行
19:マップを書く ついでに「問題のB(2,2)」の位置を設定
20:「問題のB」がゴールに着くまで繰り返す
21:表示して待つ
22:四方を調べ(次行に続く)
23:今の場所より近い方へ進む
24:ついでにまた表示
25:20行に戻る 終わってたらプロンプト(”OK”のこと)の出る位置を調整