1165-Pablo Squarson's Headache
問題概要
(略)
解説
0番目の正方形の位置を(0,0)として,全ての正方形の位置を求める.幅は,最も右にある正方形と最も左にある正方形のx座標の差+1となり,高さは,最も上にある正方形と最も下にある正方形のy座標の差+1となる.計算量はO(N)となる.
実装(C++)
#include <vector> #include <iostream> using namespace std; #define REP(i,x)for(int i=0;i<(int)x;i++) int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1}; typedef pair<int,int> P; vector<P> vec; int main(){ int xmin,ymin,xmax,ymax; int N; for(;cin>>N,N;){ xmin=ymin=xmax=ymax=0; vec=vector<P>(N); vec[0]=P(0,0); REP(i,N-1){ int n,d; cin>>n>>d; vec[i+1]=P(vec[n].first+dx[d],vec[n].second+dy[d]); xmax=max<int>(xmax,vec[i+1].first); xmin=min<int>(xmin,vec[i+1].first); ymax=max<int>(ymax,vec[i+1].second); ymin=min<int>(ymin,vec[i+1].second); } cout<<xmax+1-xmin<<" "<<ymax+1-ymin<<endl; } return 0; }