UVA - 10562 Undraw the Trees
2016-07-28 16:08
232 查看
题目大意:给出一棵树,先序遍历,输出结果。最外层给一对括号,每个节点的孩子节点用()包起,若无孩子节点,直接输出()。
解题思路:递归,注意节点不一定是字母。若节点同列的下一行是 |,表示该节点有孩子,进入 dfs,无则直接输出括号。dfs(n, l ,r),n 表示当前层,l(l>0) 表示最左的节点,r 最右。距离根据 - 的长度来确定。
解题思路:递归,注意节点不一定是字母。若节点同列的下一行是 |,表示该节点有孩子,进入 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; }
相关文章推荐
- 文件遍历排序函数
- C#递归算法之分而治之策略
- Lua 学习笔记之C API 遍历 Table实现代码
- 有关数据库SQL递归查询在不同数据库中的实现方法
- C#中的递归APS和CPS模式详解
- C#遍历文件夹后上传文件夹中所有文件错误案例分析
- C#中遍历Hashtable的4种方法
- WinForm实现按名称递归查找控件的方法
- C#递归方法实现无限级分类显示效果实例
- 使用SqlServer CTE递归查询处理树、图和层次结构
- C#递归算法之打靶算法分析
- C#中的尾递归与Continuation详解
- Erlang中遍历取出某个位置的最大值代码
- C++实现图的邻接矩阵存储和广度、深度优先遍历实例分析
- C++实现图的邻接表存储和广度优先遍历实例分析
- C#递归实现显示文件夹及所有文件并计算其大小的方法
- 举例讲解C语言程序中对二叉树数据结构的各种遍历方式
- C++非递归队列实现二叉树的广度优先遍历
- php遍历目录方法小结
- 一个目录遍历函数