题目链接:
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1503
题目大意:
将给定形式的一颗树输出成另外形式的一棵树。
解题思路:
用递归模拟建树过程,边建树边输出。
代码:
#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<stack>
#include<queue>
#define eps 1e-6
#define INF (1<<20)
#define PI acos(-1.0)
using namespace std;
int sumrow;
char save[220][220]; //边建树边输出结果
bool notin(char a) //处理字符情况
{
if(a!='-'&&a!=' '&&a!='#'&&a!='|'&&a)
return true;
return false;
}
void dfs(int row,int column)
{
putchar(save[row][column]);
if(save[row+1][column]!='|') //叶子节点
{
printf("()");
return ;
}
//非叶子节点
int left,right;
putchar('(');
left=right=column;
while(save[row+2][--left]=='-') //向左扫描'-'覆盖范围
;
left++;
while(save[row+2][++right]=='-') //向右扫描'-'覆盖范围
;
right--;
for(int i=left;i<=right&&i<strlen(save[row+3]);i++)
if(notin(save[row+3][i]))
{
dfs(row+3,i);
}
putchar(')');
return ;
}
int main()
{
int ca;
scanf("%d",&ca);
getchar();
while(ca--)
{
sumrow=0;
memset(save,0,sizeof(save));
while(gets(save[++sumrow])&&save[sumrow][0]!='#')
;
sumrow--;
if(sumrow==0) //没有考虑空树的情况,坑啊,wa了好几次
{
printf("()\n");
continue;
}
for(int i=0;i<strlen(save[1]);i++) //扫描树根的情况。
if(notin(save[1][i]))
{
putchar('(');
dfs(1,i);
putchar(')');
}
putchar('\n');
}
return 0;
}