【yukicoder】No.48 ロボットの操縦
使用言語
Python3
問題文
(0,0)に位置するロボットを(X,Y)に移動させるのに、必要な命令回数を求めよ。
ただし、1度に司令できるのは以下のいずれかである。
・90°だけ時計回り(反時計回り)に向きを変える
・向いている方向にK距離だけ進む。(1 <= K <= L(最大距離))
入力
X
Y
L
出力
指定座標(X,Y)へ到達する最小の命令回数
解放プロセス
命令には、下記の種類がある。
①進行
②向き
①進行
進む方向を①y方向②x方向の順とする。
仮に指定座標を(3, 10)、最大距離を2とする。
ロボットが進める距離は、1 <= K <= 2、の範囲内。
まずy方向に10だけ進むには、K(==2) * 5(命令回数)。
そしてx方向に1だけ進むには、K(==2)、K(==1)。
上記の2文から分かるように、
もしXまたはYをLで割り切れるなら、進行距離の命令回数はX(or Y) / L回となる
また、もし割り切れなければ、X(or Y) / L + 1回となる。
また、X,Yが負の整数の場合を考えて、X,Yをabs()で絶対値に変換する。
②向き
(X,Y)の各値によっては、向きを変える回数が変化する。
指定座標に到達するために向きを変えるための命令回数は、0,1,2の3つの種類がある。
0
X==0 Y>=0
1
X>=0(X<0), Y>=0
2
X>=0(X<0), Y<0
つまり、
Yは0以下? YES→ 2回向きを変える
NO
↓
Xは0? YES→0回向きを変える
NO
↓
1回向きを変える
ということになる。
以上より、①+②が命令回数となる。
回答コード
x = int(input()) y = int(input()) l = int(input()) def count(num1,num2): if num1%num2 == 0: return int(num1/num2) else : return int(num1/num2) + 1 if y < 0: print(2 + count(abs(x),l) + count(abs(y),l)) else: if x == 0: print(0 + count(abs(x),l) + count(abs(y),l)) else: print(1 + count(abs(x),l) + count(abs(y),l))