SRM570 Div1 Easy "RobotHerb"
問題
http://community.topcoder.com/stat?c=problem_statement&pm=12427
訳
ロボットに整数の配列aを与えると各iにおいて以下のように動く。
まず、a[i]だけ前進する。 その後、a[i]だけ90度右に回転する。
最初ロボットは座標(0, 0)で北向き(yの正方向)に立っている。
ロボットに整数の配列aをT回与えたとき、
座標(0,0)からどれだけ離れた場所いるかを返せ。
2点(x1, y1) (x2, y2)の距離はabs( x1 - x2 ) + abs( y1 - y2 )と定義する。
制約
1 <= T <= 10^9
1 <= aの長さ <= 50
1 <= aの値 <= 10^7
考えた事
4回動けば必ず北向きになり、
それを1つの単位として計算してあげればよい
ソースコード
class RobotHerb { public: long long getdist(int T, vector <int> a){ int N = a.size(); int A = T / 4; int B = T % 4; long long x = 0, y = 0; int d = 0; int dy[] = { 1, 0, -1, 0 }; int dx[] = { 0, 1, 0, -1 }; // 4ターン移動 for( int t = 0; t < 4; t++ ){ for( int i = 0; i < N; i++ ){ int len = a[i]; x += dx[d] * len; y += dy[d] * len; d = (d + len) % 4; } } x = x * A; y = y * A; // 残りターン移動 for( int t = 0; t < B; t++ ){ for( int i = 0; i < N; i++ ){ int len = a[i]; x += dx[d] * len; y += dy[d] * len; d = (d + len) % 4; } } return abs( x ) + abs( y ); } };