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

まさかの参加記より先に解説記事。参加記が永久に書かれない気がしてきた。

問題概要

正方形を座標平面状に、軸に平行に、かつ新しく並べる正方形は、既に並べた正方形のどれかと一辺がちょうど重なるように並べる。


2番目の正方形から、「(それまでに並べた正方形の中で)それが接する正方形の番号」、および「上下左右どの向きに接するか」が与えられたとき、全ての正方形を囲う座標軸に平行な長方形の幅と高さを求めよ。

解法

平行移動の自由度を除いて各正方形の位置は一意に定まる(しゃれじゃないよ!)ので、最初の正方形の(左上の点の)座標を(0,0)などと置いて、座標を全て求める。


y座標の最大値+1-y座標の最小値が高さ、x座標の最大値+1-x座標の最小値が幅になる。

ソースコード

int n,px[200],py[200];

int main(){
	while(cin>>n,n)
	{
		px[0]=py[0]=0;
		
		int x=0,X=0,y=0,Y=0;
		
		rep(i,n-1)
		{
			int m,d; cin>>m>>d;
			px[i+1]=px[m]+dx[d];
			py[i+1]=py[m]+dy[d];
			x=min(x,px[i+1]); X=max(X,px[i+1]);
			y=min(y,py[i+1]); Y=max(Y,py[i+1]);
		}
		cout<<X-x+1<<" "<<Y-y+1<<endl;
	}
	return 0;
}