WARush

SRMの結果とか、解けた問題のコードを書いていきます

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