题目大意
绘制一棵给定的二叉树。
解题思路
模拟即可。代码比较乱。
#include <cstdio>
#include <cstdlib>
#include <cstring>
const int MAXN=12;
//第i条边的长度
int eglen[MAXN]={0, 1};
//前i条边的长度之和(包括节点)
int egsum[MAXN]={0, 1};
int n, m;
bool tf[MAXN][(1<<MAXN)];
void change (int x, int y){
if (x>n) return;
tf[x][y]=0;
change (x+1, y*2-1); change (x+1, y*2);
}
void init (){
memset (tf, 1, sizeof (tf));
for (int i=2; i<n; ++i){
eglen[i]=egsum[i-1]+i-1;
egsum[i]=egsum[i-1]+eglen[i];
}
for (int i=1; i<n; ++i)
egsum[i]+=i;
for (int i=1; i<=m; ++i){
int s1, s2;
scanf ("%d%d", &s1, &s2);
change (s1, s2);
}
}
int main (){
scanf ("%d%d", &n, &m);
init ();
for (int i=n-1; i>=1; --i){
for (int j=1; j<=egsum[i]; ++j) printf (" ");
for (int j=1; j<=(1<<(n-i-1)); ++j){
if (tf[n-i][j]) printf ("o");
else printf (" ");
for (int k=1; k<=eglen[i+1]*2+1; ++k) printf (" ");
}
puts ("");
for (int j=1; j<=eglen[i]; ++j){
for (int k=1; k<=egsum[i]-j; ++k) printf (" ");
for (int l=1; l<=(1<<(n-i-1)); ++l){
if (tf[n-i+1][l*2-1]) printf ("/");
else printf (" ");
for (int k=1; k<=j*2-1; ++k) printf (" ");
if (tf[n-i+1][l*2]) printf ("\\");
else printf (" ");
for (int k=1; k<=eglen[i+1]*2+1-j*2; ++k) printf (" ");
}
puts ("");
}
}
for (int i=1; i<=(1<<(n-2)); ++i){
if (tf[n][i*2-1]) printf ("o ");
else printf (" ");
if (tf[n][i*2]) printf ("o ");
else printf (" ");
}
}