第13回 考える楽しさ、習う楽しさ「3.迷路を作ろう その1」
|
|
13−3 迷路を作ろう その1
さて、長い前置きでしたが、やっと本題の迷路を考えることにしましょう。 とはいえ、唐突に、何をどうやって考えてよいのかわかりませんよね。 そもそも、
ということを考えてみようとしても、なかなかすっきりした答えにたどり着けません。 まぁ、とりあえず、そういう時は、逆に考えてみましょう。
ということです。 このことを考えてみると、下の図のように、単にブロックが並んでいるだけだと、迷路にならないことがわかります。 (ただし、極端な方向音痴だと、迷うかもしれませんが) ![]() 次に、この空いている部分に適当にブロックを入れたら、迷路になるんじゃないかな、と考えてみました。 ![]() 何とか、迷路になりそうですね。安直ですが、この考え方で作ってみましょう。 先ほど考えた手順どおり、まず、迷路にならない状態を作ってみます。 これは、図で明らかなように、座標が奇数の部分にブロックを置けばよさそうです。 ![]() 外壁はブロックですから、実際の最も左上のブロックは(3,3)、右下は(23,23)ですね。 したがって、これらのブロックを置くプログラムは、For〜Nextを使って次のようになります。
さて、この状態にブロックを置いて迷路を作る場合、置いてよい場所と、そうでない場所がある事に気付きます。 ![]() この色分けした図でもわかるように、赤い部分に置くと、通路を不自然にふさいでしまうので、これは禁則とすべきでしょう。 交差点の真中に、唐突にブロックがあっても、仕方ないですからね。 各座標の偶数・奇数に注目してまとめると、こんな表ができます。
この表から、縦と横、少なくともどちらか一方が奇数であればブロックとして置いてもよさそうです。 つまり両方とも偶数の場所には、置いてはいけない、ということです。 ある数字が偶数か奇数かを判別する方法ですが、これは簡単です。2で割った余りが1なら奇数、0なら偶数です。 NS Basicでは Mod()という関数で余りを求めることができ、Nを2で割った余りは、Mod(N,2)で求めることができます。 (※VBなどでは、N mod 2 求めることができますので、こちらは『演算子』の扱いになりますね。) プログラムは、とりあえずシンプルにブロックを置くようにしてみました。
様子を見るために100回のループにしましたが、これでも一通りの迷路らしいものができるようです。 (あ、正確には、101回のループですね。) ![]() さて、この方法からブロック置く位置の重複を除外するなど、もう少し発展させれば、完成度の高い迷路ができるかと思います。 しかしその「もう少し」が難しそうなのです。 何度か迷路を作っていて気づいたのですが、たまに、こういう状態が出来てしまいました。 ![]() この行き詰まった所ができないようにするためには、ブロックを置く前に、何らかのチェックをしなければなりません。 しかし、ちょっと考えてみても、その方法は簡単ではなさそうです。 もしかしたら、スタートからゴールまでの道が寸断される場所にブロックが置かれてしまう可能性もあるでしょう。 ということで、この考え方はあっさり捨てて、別の方法を考えることにしましょう。 ここで苦労をするより、まずは、他の方法を模索した方がよさそうです。やはり、人間、あきらめることも肝心です。 |
|||||||||||||||||
第13回 考える楽しさ、習う楽しさ「3.迷路を作ろう その1」
|