您的位置:首页 > 其它

UVA - 10562 Undraw the Trees

2016-07-28 16:08 232 查看
题目大意:给出一棵树,先序遍历,输出结果。最外层给一对括号,每个节点的孩子节点用()包起,若无孩子节点,直接输出()。

解题思路:递归,注意节点不一定是字母。若节点同列的下一行是 |,表示该节点有孩子,进入 dfs,无则直接输出括号。dfs(n, l ,r),n 表示当前层,l(l>0) 表示最左的节点,r 最右。距离根据 - 的长度来确定。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
using namespace std;
char map[500][500];
void dfs(int n, int l, int r) {
printf("(");
for (int i = l; i < r; i++) {
if (map
[i] != ' ' && map
[i] != '#' && map
[i] != '\0') {
printf("%c", map
[i]);
if (map[n+1][i] == '|') {
int lef = i, rig = i;
while (map[n+2][lef] == '-') lef--;
while (map[n+2][rig] == '-') rig++;
if (lef < 0) lef = 0;
dfs(n+3, lef, rig);
}
else printf("()");
}
}
printf(")");
}
int main() {
int T;
scanf("%d", &T);
getchar();
while (T--) {
memset(map, 0, sizeof(map));
int n = 0;
while (gets(map
)) {
if (map
[0] == '#') break;
n++;
}
dfs(0, 0, strlen(map[0]));
printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  递归 遍历 dfs uva