UVa 10562 Undraw the Trees 看图写树
转载请注明:
仰望高端玩家的小清新 http://www.cnblogs.com/luruiyuan/
题目大意:
题目传送门:UVa 10562Undraw the Trees
给定字符拼成的树,将这些树转换成特定的括号表示的树
思路:
首先,观察样例,可以发现就是先序遍历的顺序,因此可以确定dfs
但是,还有几个地方需要考虑:
- 同一级的结点,在同一级的括号中
- 由于顺序满足先序遍历,因此不需要存储树的括号表示法,更不需要构建树,直接在遍历过程中输出即可。
- 空树:即输入为:# 时的树的处理,我不建议在此进行特判,因为本题的条件非常简单,完全可以把这个情况纳入普通情况进行处理,详见代码 27行 和 32行。
- 关于数组初始化的问题:这里数组必须初始化,我一开始为了效率不想初始化,但是马上就wa了,其原因在于(我个人推测),存在相对刁钻的数据,使得上一次的输入的tree中 ‘|’ 符号出现在了本次 tree 中某一行的 '\0' 之后,这样的话,在本次 tree 做 dfs 时,由于找到了上一次 tree 的 '|' 而导致读取到了上一次 tree 的数据。
- 森林,有可能某种情况下,可以给出多个根的树,这样就成为了一个森林,需要考虑多根情况。
- "----"中我们其实不需要显式找出其右边界,只要知道左边界即可。
- 输出数据格式的问题:这里必须吐槽UVA的测试数据,原本我的输出是最后一行不再输出换行符,没想到UVA给我判了wa,把对最后一行的特判去掉后,最后一行也输出换行,才最终ac,出题人有点不注意细节啊,必须批评一波。
- 其他 trick:比如用 valid_node 函数中,用字符串匹配代替 if else;读取 tree 时通过 while 循环一行完成读取,而不必写成函数徒增复杂度;使用 fgets 和 sscanf 来读取含有多余空白符的数字。
- #include<cstdio>
- #include<cstdlib>
- #include<cstring>
- const int SIZE = + ;
- char tree[SIZE][SIZE];
- int num = ; // tree num
- int cur = ; // cur num of row in tree
- bool valid_node(char ch);
- void dfs_tree(int row, int col);
- int main(){
- // use fgets() and sscanf() to read white char and then remove them.
- fgets(tree[], SIZE, stdin);
- sscanf(tree[], "%d", &num);
- while(num--){
- // read tree
- cur = ;
- // memset is compulsory because the '|' behind the '\0' of the last tree will
- // have a bad influence on current tree
- memset(tree, , sizeof(tree));
- // use fgets() instead of gets() to read tree in order to avoid overflow
- while(fgets(tree[cur], SIZE, stdin) != NULL && tree[cur][] != '#')cur++;
- // dfs - for the condition of forest
- printf("(");
- for(int i=; tree[][i]; i++)
- if(valid_node(tree[][i]))
- dfs_tree(, i);
- // postprocess. If we use "if(num > 0)puts("");", it will cause "wrong answer"
- printf(")\n");
- }
- }
- bool valid_node(char ch){
- return strchr("-| #\n", ch) == NULL; // we need add '\n' because fegets() will read the '\n' at end of each line to the tree.
- }
- void dfs_tree(int row, int col){
- printf("%c(", tree[row][col]); // print root of the tree, and then print '('
- if(row < cur && tree[++row][col] == '|'){
- int i=col;
- row++;
- while(i - >= && tree[row][i-] == '-')i--; // left bouder of "---"
- for(;tree[row][i] == '-'; i++)
- if(valid_node(tree[row+][i])) dfs_tree(row+, i);
- }
- printf(")");
- }
啦啦啦,今天就到这里啦~改天见*★,°*:.☆( ̄▽ ̄)/$:*.°★* 。
UVa 10562 Undraw the Trees 看图写树的更多相关文章
- 看图写树 (Undraw the Trees UVA - 10562)
题目描述: 原题:https://vjudge.net/problem/UVA-10562 题目思路: 递归找结点 //自己的代码测试过了,一直WA,贴上紫书的代码 AC代码 #include< ...
- Uva 10562 看图写树
题目链接:https://uva.onlinejudge.org/external/105/10562.pdf 紫书P170 直接在二维数组上做DFS,用的fgets函数读入数据,比较gets函数安全 ...
- UVa 10562看图写树(二叉树遍历)
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- UVa 10562 Undraw the Trees(递归遍历)
题目链接: https://cn.vjudge.net/problem/UVA-10562 Professor Homer has been reported missing. We suspect ...
- uva 10562 undraw the trees(烂题) ——yhx
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABB4AAAM9CAYAAAA7ObAlAAAgAElEQVR4nOyd25GsupKGywVswAV8wA ...
- UVa 10562 Undraw the Trees
题意: 将树的关系用字符串的形式给出 分析: 直接dfs搜索,第i行第j个如果是字母,判断i+1行j个是不是'|'是的话在第i+2行找第一个'-',找到后在第i+3行找字母,重复进行. 代码: #in ...
- UVA - 10562 Undraw the Trees(多叉树的dfs)
题意:将多叉树转化为括号表示法. 分析:gets读取,dfs就好了.注意,样例中一行的最后一个字母后是没有空格的. #pragma comment(linker, "/STACK:10240 ...
- UVA10562(看图写树,dfs)
这个题过的好艰难,不过真的学到好多. 关于fgets的用法真的是精髓.!isspace(c)和c!=' '是有区别的. 其它的看代码吧 #include <iostream> #inclu ...
- 6-17 看图写树 uva10562
非常好的dfs题 有很多细节 关于‘ ’ ‘0’ ’\n‘ 的处理 他们都属于isspace函数 其中 while(buf[x+2][i]=='-'&&buf[x+3][i] ...
随机推荐
- oracle 存储过程 技巧
我们在进行pl/sql编程时打交道最多的就是存储过程了.存储过程的结构是非常的简单的,我们在这里除了学习存储过程的基本结构外,还会学习编写存储过程时相关的一些实用的知识.如:游标的处理,异常的处理,集 ...
- Stirling数笔记
Updating.... 这几个玩意儿要记的东西太多太乱所以写blog整理一下 虽然蒯的成分会比较多全部 我居然开始记得写blog了?? 第一类 这里讨论的是无符号类型的. OEIS编号A130534 ...
- 【设计模式】 模式PK:门面模式VS中介者模式
1.概述 门面模式为复杂的子系统提供一个统一的访问界面,它定义的是一个高层接口,该接口使得子系统更加容易使用,避免外部模块深入到子系统内部而产生与子系统内部细节耦合的问题.中介者模式使用一个中介对象来 ...
- redis cluster以及master-slave在windows下环境搭建
一.redis cluster环境搭建: 1.了解Redis Cluster原理: 详细了解可参考:http://doc.redisfans.com/topic/cluster-tutorial.ht ...
- 【BZOJ2882】工艺 [SAM]
工艺 Time Limit: 10 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description 小敏和小燕是一对好朋友. 他们正在玩一 ...
- 使用TSQL语句操作MySQL数据库
使用TSQL语句创建数据库 以前用的是鼠标在界面上手动创建,这样创建会比较麻烦,而且还会经常出问题.在其它电脑上要用的话还需要重复操作.所以要使用程序代码操作,能通过代码的就不用手动操作. 在数据库界 ...
- Winform Socket通信
Socket相关概念[端口] 在Internet上有很多这样的主机,这些主机一般运行了多个服务软件,同时提供几种服务.每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务(应 ...
- HTML中设置超链接字体 & 字体颜色
定义链接样式 CSS为一些特殊效果准备了特定的工具,我们称之为“伪类”.其中有几项是我们经常用到的,下面我们就详细介绍一下经常用于定义链接样式的四个伪类,它们分别是: :link :visited : ...
- SQL注入文件读取通过from for分页读取
http://103.238.227.13:10088/?id=1 在读取文件的时候发现不能够一下子全部读取出来.经过百度学习了一下,看到别人使用from for说实在此前真不知道这操作. 先来看一下 ...
- yocto 离线编译
使用yocto编译一个软件包时,一般会先在本地寻找下载好的源码包,如果不存在则根据配置从网络下载. 添加本地源码包 为了支持离线编译,添加一个包的配置文件后,需要在本地也准备好源码包. 可以先打开网络 ...