http://acm.timus.ru/problem.aspx?space=1&num=1358
画一个方格阵 按一定次序 依次放节点就可以了
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<map> #include<vector> #include<stack> #include<set> #include<map> #include<queue> #include<algorithm> #include<cmath> #define LL long long //#pragma comment(linker, "/STACK:1024000000,1024000000") using namespace std; const int N=1005; const int INF=0x3f3f3f3f; //typedef pair<int,int>point; int X[N],Y[N]; struct node { int j,next; }side[N*2]; int head[N],I; bool visited[N]; void add(int i,int j) { side[I].j=j; side[I].next=head[i]; head[i]=I++; } void init(int n) { memset(head,-1,sizeof(head)); I=0; for(int i=1;i<n;++i) { int l,r; scanf("%d %d",&l,&r); add(l,r); add(r,l); } } void solve(int n) { memset(visited,false,sizeof(visited)); queue<int>qt; vector<int>vt; qt.push(1); visited[1]=true; X[1]=1; Y[1]=1; int l=1; while(true) { vt.clear(); while(!qt.empty()) { int x=qt.front();qt.pop(); for(int t=head[x];t!=-1;t=side[t].next) { int j=side[t].j; if(!visited[j]) { visited[j]=true; vt.push_back(j); } } } if(vt.size()==0) break; l=l+2; while(true) { int tmp=(l>n)?(n+n-l):l; if(tmp>=vt.size()) break; ++l; } int x,y; if(l<=n) {x=l;y=1;} else {x=n;y=l-n+1;} for(unsigned int i=0;i<vt.size();++i) { X[vt[i]]=x; Y[vt[i]]=y; qt.push(vt[i]); --x;++y; } } } int main() { //freopen("data.in","r",stdin); int n; while(scanf("%d",&n)!=EOF) { init(n); solve(n); for(int i=1;i<=n;++i) printf("%d %d\n",X[i],Y[i]); } }