Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
变态题啊感觉通过倒着推。能找出来谁第一轮没有参赛。这样第一轮缺的每一个赛事补上两个虚拟的队。。 然后就是在一个大buffer里打印。 #include<queue> #include<iostream> #include<stdio.h> #include<vector> #include<limits.h> #include<string.h> #include<string> using namespace std; string team[40]; int round[40]; int n,m; char buf[100][205]; int main() { int cs = 1; while(cin>>n){ if(n==-1) break; for(int i=0;i<n;i++) cin>>team[i]; memset(round,-1,sizeof round); round[n-1] = 0; m = 0; queue<int> q; q.push(n-1); while(!q.empty()){ int h = q.front(); q.pop(); int x = ((h>>1)<<1)-2; for(;x>=0;x-=2){ if(team[x]==team[h]||team[x+1]==team[h]) break; } if(x>=0){ round[x] = round[x+1] = round[h]+1; m = max(m,round[x]); q.push(x), q.push(x+1); } } vector<vector<string> > g(m+1,vector<string>()); q.push(n-1); g[0].push_back(team[n-1]); while(!q.empty()){ int h = q.front(); q.pop(); int x=((h>>1)<<1)-2; int d = round[h]; for(;x>=0;x-=2){ if(team[x]==team[h]||team[x+1]==team[h]) break; } if(x>=0){ q.push(x),q.push(x+1); g[d+1].push_back(team[x]); g[d+1].push_back(team[x+1]); }else if(round[h]<m){ g[d+1].push_back(""); g[d+1].push_back(""); } } printf("Tournament %d\n",cs++); memset(buf,' ',sizeof buf); int line = 2*(g[m].size()-1)+1; //cout<<line<<endl; int cur = 0; for(int i=m;i>=0;i--){ int r = m-i; //start from line 2^r //space 2^(r+1) //2^r slash int wid = 0; for(int j=0;j<g[i].size();j++) wid = max(wid,(int)g[i][j].size()+2); int a = 1<<r; int b = a<<1; for(int j=0,l=a;j<g[i].size();j++,l+=b){ if(!g[i][j].size()) continue; int k = cur; buf[l][k++] = '_'; for(int x=0;x<g[i][j].size();x++) buf[l][k++] = g[i][j][x]; for(int x=0;x<wid-1-g[i][j].size();x++) buf[l][k++] = '_'; if(g[i].size()==1) continue; if(j%2){ for(int x=l,y=cur+wid,cnt=0;cnt<a;cnt++,x--,y++) buf[x][y]='/'; // up slash }else{ for(int x=l+1,y=cur+wid,cnt=0;cnt<a;cnt++,x++,y++) buf[x][y]='\\'; } } cur+=wid+a; } for(int i=1;i<=line;i++){ int j; for(j=200;j>=0;j--){ if(buf[i][j]!=' ') break; } buf[i][j+1] = 0; if(j==-1)continue; printf("%s\n",buf[i]); } } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator