プログラミングコンテストでは、たとえば2次元マップと移動体が与えられ、設定されたスタート地点から、複数の方向転換および移動を行った上で、最終的にその移動体はどの位置(座標)にいるか?が問われるような問題があります。
その際に重要となるのが、方向の状態確認です。そこで今回はその方向の状態を確認する方法を紹介します。
下図のように、4方向がそれぞれ N, E, S および Wとして与えられ、今の段階で移動体は方向Nを向いているとします。
これに対して、時計回りに90度向きをかえることを「右を向く」、さらに時計回りに90度(はじめから言えば180度)向きをかえることを「後ろを向く」、さらにさらに時計回りに90度(はじめから言えば270度)向きをかえることを「左を向く」と言うとします。
例えば、(図1)の状態から
1. 「右を向けば」方向はE、
2. そこから「後ろを向けば」方向はW、
3. そして「左を向けば」方向はS となります。
これを管理するには、方向を数字として扱い、mod( % )を使えば良いです。
ざっくり言えば、4方向を管理する場合、0〜3までの4つの数字で方向を表すようにし、向きをかえた場合は、これに加算を行います。方向転換を行い続けると3を超える数字が出現しはじめますが、その際は4で割った余り(mod)を取得すれば、0〜3までの4つの数字に収まります。
念のために、0~9までの数字を4で割ったあまりがどうなっていくのかをみてみます。
for i in range(10):
print(i%4)
# --> 0
# --> 1
# --> 2
# --> 3
# --> 0
# --> 1
# --> 2
# --> 3
# --> 0
# --> 1
結果は0~3の間にきちんとおさまっていますね。
より具体的に方向について考えてみます。
まず(図2)のようにそれぞれの方向を数字に置き換えます。
そして 変数として direct を用意すれば、(図1)の状態は以下のように表せます。
direct = 0%4
# direct = 0 = N
これに対して、上記の例で考えれば、
1. 「右を向けば」方向はE、
に対しては、direct に1を足してやれば良さそうです。
direct = (direct + 1)%4
# direct = 1 = E
2. そこから「後ろを向けば」方向はW、
に対しては、direct に2を足してやれば良さそうです。
direct = (direct + 2)%4
# direct = 3 = W
3. そして「左を向けば」方向はS
に対しては、注意が必要で、direct から1を引けば、良さそうですがこれをやってしまうと例えば direct = 0の場合に direct = -1 となりマイナスの値が発生しはじめます。このマイナスの値に対する mod の使用は、プログラミング言語により出力結果が異なるので、あまり好まれないようです。よってここでは、「左を向く」に関しては direct が正の値であることを担保するために +3 とすることにします。よって、
direct = (direct + 3)%4
# direct = 2 = S
となります。
改めて、4方向の状態を確認したい場合は、
・4方向を0〜3の数字で表す。
・時計回りに考えて、
右を向くは +1
後ろを向くは +2
左を向くは +3
として、先の数字に加算する。
・modを用いて(%4)、その数字の剰余を算出する。
以上になります。