UVa 10562 Undraw the Trees

题意:

  将树的关系用字符串的形式给出

分析:

  直接dfs搜索,第i行第j个如果是字母,判断i+1行j个是不是‘|‘是的话在第i+2行找第一个‘-‘,找到后在第i+3行找字母,重复进行。

代码:

#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>using namespace std;const int maxn=210;int n;char a[maxn][maxn];void dfs(int r,int c){    printf("%c(",a[r][c]);    if(r+1<n&&a[r+1][c]==‘|‘)    {        int i=c;        while(i-1>=0&&a[r+2][i-1]==‘-‘)            i--;        while(a[r+2][i]==‘-‘&&a[r+3][i]!=‘\0‘)        {            if(!isspace(a[r+3][i]))                dfs(r+3,i);            i++;        }    }    printf(")");}void solve(){    n=0;    while(1)    {        gets(a[n]);        if(a[n][0]==‘#‘)            break;        else            n++;    }    printf("(");    if(n)    {        for(int i=0;i<=strlen(a[0]);i++)        {            if(a[0][i]!=‘ ‘)            {                dfs(0,i);                break;            }        }    }    printf(")\n");}int main(){    int T;    scanf("%d",&T);    getchar();    while(T--)    {        solve();    }}
时间: 2024-08-25 14:23:39

UVa 10562 Undraw the Trees的相关文章

UVa 10562 Undraw the Trees 看图写树

转载请注明: 仰望高端玩家的小清新 http://www.cnblogs.com/luruiyuan/ 题目大意: 题目传送门:UVa 10562Undraw the Trees 给定字符拼成的树,将这些树转换成特定的括号表示的树 思路: 首先,观察样例,可以发现就是先序遍历的顺序,因此可以确定dfs 但是,还有几个地方需要考虑: 同一级的结点,在同一级的括号中 由于顺序满足先序遍历,因此不需要存储树,更不需要构建树,直接在遍历过程中输出即可. 空树:即输入为:# 时的树的处理,我不建议在此进行

uva 10562 undraw the trees(烂题) ——yhx

无需建树,递归即可. 为什么说是烂题呢? 1.pdf里的样例数据复制过来丢了空格,导致我调了很久都没有发现问题在哪. 2.如样例2所示,4个'-'下面却少一格. 3.空树,即只有'#'需要特殊处理. 1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<string> 5 using namespace std; 6 char map[210][210]; 7 int m

Undraw the Trees (Uva 10562)

题意:将多叉树转化为括号表示法.每个结点用除了‘-’, ‘|’, ‘ ’(空格), ‘#’ 的其他字符表示,每个非叶结点的正下方会有一个 ‘|’ 字符,然后下面是一排 ‘-’ 字符,恰好覆盖所有子节点的上方.单独的一行 ‘#’ 为数据结束. 例样输入: 2  A  |--------B C   D    |   | ----- - E  F G#e|----f g# 例样输出: (A(B()C(E()F())D(G()))) (e(f()g())) 思路: 将输入数据存入二维数组,在二维数组中进

Undraw the Trees 字符串数组递归画树

Undraw the Trees 题目抽象:给出一个二维字符数组表示的树,将其表示成一维字符数组表示的树. 思路:直接在二维字符数组中递归画树即可. 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <algorithm> 6 using namespace std; 7 const int MS=205; 8

UVa 10562 (特殊的输入处理方式) Undraw the Trees

题意: 给出一个二维字符数组,它代表了一棵树.然后将这棵树转化为括号表示法(以递归的形式). 分析: 这道题最大的特色就是对数据的处理方式,里面用到了一个 fgets() 函数,这个函数的功能有点像c++里面的cin.getline() 函数介绍: 从文件结构体指针stream中读取数据,每次读取一行.读取的数据保存在buf指向的字符数组中,每次最多读取bufsize-1个字符(第bufsize个字符赋'\0'),如果文件中的该行,不足bufsize个字符,则读完该行就结束.如若该行(包括最后一

UVa 10562 看图写树

题目:题目就是给出一幅ASCII字符构成的树的图,然后转换成由字符括号构成的树的表示形式.可以知道,树有孩子结点的话,正下方会有一个字符 '|' ,紧接着会有一个覆盖所有孩子结点的字符序列"-------",然后其下就是孩子结点. 思路:先将所有数据读下来.然后递归处理,给定一个左右边界,在该边界内逐个检查字符,如果是结点字符,则判断有无孩子等后续处理. 注意:因为每行会有空格,所以不能用scanf输入,换成fgets的话会保留有换行符(当然,可以进行处理或后续判断),这里使用的是ge

UVa 10007 - Count the Trees(卡特兰数+阶乘+大数)

题目链接:UVa 10007 题意:统计n个节点的二叉树的个数 1个节点形成的二叉树的形状个数为:1 2个节点形成的二叉树的形状个数为:2 3个节点形成的二叉树的形状个数为:5 4个节点形成的二叉树的形状个数为:14 5个节点形成的二叉树的形状个数为:42 把n个节点对号入座有n!种情况 所以有n个节点的形成的二叉树的总数是:卡特兰数F[n]*n! 程序: 1 import java.math.BigInteger; 2 import java.util.Scanner; 3 public cl

UVa 10303 - How Many Trees?

题目:求n个节点(元素不同)的BST的个数. 分析:组合,计数,卡塔兰数,大整数.卡塔兰数的应用. 说明:利用递推计算卡塔兰数. #include <iostream> #include <cstdlib> #include <cstdio> using namespace std; int C[1005][1005] = {0}; int main() { C[1][0] = 1; for (int i = 2 ; i < 1001 ; ++ i) { for

UVa 10007 - Count the Trees

题目:统计n个节点的二叉树的个数. 分析:组合,计数,卡特兰数,大整数. n个节点的二叉树的形状有Cn个,求不同的树的个数,用卡特兰数乘以全排列n! 说明:打表计算,查询输出,提高效率. #include <iostream> #include <cstdlib> #include <cstdio> using namespace std; int C[305][2005] = {0}; int main() { C[1][0] = 1; for (int i = 2