mazinlabsのブログ

RubyとかCloudとかその辺の記事を書いたり書かなかったり

角角画伯,かく悩みき

7月2日にACM ICPCの国内予選があったらしい。
懐かしいなーと思って、寝る前に久しぶりに問題を解いてみようと思った。

http://honiden-lab.ex.nii.ac.jp/events/icpc2010/contest/A_ja.html

・・・Javaの書き方を忘れてEclipseに怒られまくったorz
サンプルのInput, Outputは一発であったけどこれで合ってるかはわからんし、所要時間が40分とか鈍ってる気がする。


そのうち10分ぐらいはJavaのお作法との戦いだった気がするということにしてください・・・


以下汚いソースコード

package problemA;

import java.awt.Point;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class ProblemA {
	final static int INIT = 200;
	
	static Point checkSize(List<Point> pointList){
		Point low = new Point(INIT, INIT);
		Point high = new Point(INIT, INIT);
		
		for(Point p : pointList){
			if(high.x < p.x) high.x = p.x;
			if(p.x < low.x) low.x = p.x;
			if(high.y < p.y) high.y = p.y;
			if(p.y < low.y) low.y = p.y;
		}
		
		Point ans = new Point();
		ans.x = high.x - low.x + 1;
		ans.y = high.y - low.y + 1;
		
		return ans;
	}
	
	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		for(;;){
			int n;
			n = sc.nextInt();
			if(n == 0) break;
			
			int ni, di;
			List<Point> pointList = new ArrayList<Point>();
			Point p = new Point(INIT,INIT);
			
			pointList.add(p);
			
			for(int i = 0; i < n - 1; i++){
				ni = sc.nextInt();
				p = pointList.get(ni);
				
				Point next = new Point(p.x, p.y);
				di = sc.nextInt();
				switch(di){
					case 0:
						next.x-=1;
						break;
					case 1:
						next.y+=1;
						break;
					case 2:
						next.x+=1;
						break;
					case 3:
						next.y-=1;
						break;
				}
				pointList.add(next);
			}
			Point ans = checkSize(pointList);
			System.out.println(ans.x + " " + ans.y);
		}
	}
}