【yukicoder】No.48 ロボットの操縦

 

 使用言語

 

Python3

 

問題文

 

(0,0)に位置するロボットを(X,Y)に移動させるのに、必要な命令回数を求めよ。

ただし、1度に司令できるのは以下のいずれかである。

・90°だけ時計回り(反時計回り)に向きを変える

・向いている方向にK距離だけ進む。(1 <= K <= L(最大距離))

 

No.48 ロボットの操縦 - yukicoder

 

入力

 

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))