ACM-ICPC 2010国内予選 A. 角角画伯,かく悩みき

こっそり国内予選の問題を解いたので、記録でも書いてみます。
ちなみに、Fは自分の実力では謎。
あと、問題の概要は問題文が日本語なので省略します。

A. 角角画伯,かく悩みき

解法

  • 問題文通りに各タイルの位置を計算する
    • i番目のタイルの位置(x, y)を配列で持っておく
    • dが示す移動方向をdx, dyなどで定義しておくと実装が楽
  • 各方向のサイズは,(座標の最大値−座標の最小値+1)で求められる
#include <iostream>

using namespace std;

char dx[] = {-1, 0, 1, 0};
char dy[] = {0, 1, 0, -1};

int main(){
    int N;
    int x[200], y[200];
    x[0] = y[0] = 0;
    while(cin >> N, N){
        for(int i=0;i<N-1;i++){
            int ni, di; cin >> ni >> di;
            x[i+1] = x[ni] + dx[di];
            y[i+1] = y[ni] + dy[di];
        }
        int minx = 0, maxx = 0, miny = 0, maxy = 0;
        for(int i=0;i<N;i++){
            minx = min(minx, x[i]);
            maxx = max(maxx, x[i]);
            miny = min(miny, y[i]);
            maxy = max(maxy, y[i]);
        }
        cout << (maxx-minx+1) << " " << (maxy-miny+1) << endl;
    }
}