http://acm.zjut.edu.cn:8181/web/problem.php?id=1153
1153: 圣诞树
Description
每年圣诞节,大街小巷都会被各式各样的圣诞树装点着。就像下面这些图片里面的一样。
然而作为程序员,我们也不能闲着。有个耐不住寂寞的同学,就把下图上传到了人人网。
呵呵,这就是所谓的程序员的圣诞树。它是一棵二叉树,树的每个结点是字符,树的
中序遍历就是字符串。作为程序员,应该都会画这样的圣诞树是不是?你的任务就是对于给定的字符串,画出这样的二叉树。
注意树枝的画法,除了最下层的树枝画在字母的正上方,其余的树枝将画在两个结点的中点位置。还有就是为了美观,空格都由下划线“_”表示,也就是说字符串“MERRY CHRISTMAS”用 “MERRY_CHRISTMAS”表示。
Input
第一行一个整数 T ,表示有 T 个字符串。
每个字符串占一行,字符串由大写字母和下划线“_”组成,字符串的长度为 (2
i - 1) ,其中 2 ≤ i≤ 7 。
Output
对于每组输入数据,输出一棵画好的二叉树,
每组数据后留一个空行。注意行末不要输出多余的空格。
Sample Input
4
MERRY_CHRISTMAS
CHRISTMAS_TREES
NEW
ZJUTACM
Sample Output
H
/ \
R T
/ \ / \
E _ I A
/ \ / \ / \ / \
M R Y C R S M S
A
/ \
I R
/ \ / \
H T _ E
/ \ / \ / \ / \
C R S M S T E S
E
/ \
N W
T
/ \
J C
/ \ / \
Z U A M
#include<iostream>
#include<string>
#include<cmath>
using namespace std;
int main()
{
int t;
cin>>t;
string s;
getline(cin,s);
while(t--)
{
getline(cin,s);
int p;
if(s.size()==3) p=2;
else if(s.size()==7) p=3;
else if(s.size()==15) p=4;
else if(s.size()==31) p=5;
else if(s.size()==63) p=6;
else if(s.size()==127) p=7;
int ss=s.size();
for(int i=0;i<p;i++)
{
for(int k=0;k<ss/2;k++) cout<<" ";
for(int j=0;j<(int)(pow(2,i*1.0));j++)
{
cout<<s[ss/2+j*(ss+1)];
if(j!=(int)(pow(2,i*1.0))-1)
{
for(int x=0;x<ss;x++)
cout<<" ";
}
}
cout<<endl;
if(i!=p-1&&i!=p-2)
{
for(int y=0;y<ss/4;y++)
cout<<" ";
for(int yy=0;yy<(ss/2-ss/4+1)/2;yy++)
cout<<" ";
cout<<"/";
for(int z=0;z<ss/4;z++)
cout<<" ";
cout<<"\\";
for(int f=0;f<(int)(pow(2,i*1.0))-1;f++)
{
for(int yy=0;yy<(ss/2-ss/4+1)/2;yy++)
cout<<" ";
for(int yy=0;yy<ss/2;yy++)
cout<<" ";
for(int yy=0;yy<(ss/2-ss/4+1)/2;yy++)
cout<<" ";
cout<<"/";
for(int z=0;z<ss/4;z++)
cout<<" ";
cout<<"\\";
}
cout<<endl;
}
if(i==p-2)
{
for(int h=0;h<(int)(pow(2,i*1.0));h++)
{
cout<<"/ \\";
if(h!=(int)(pow(2,i*1.0))-1) cout<<" ";
}
cout<<endl;
}
ss/=2;
}
cout<<endl;
}
return 0;
}