Uvaoj10562
好忧伤...这题又让我做了一上午....关键是细节.如果一直是WA你可以考虑带入这些情况看一下!
--------------------------------------------------------------------------
第一种
1
a
#
结果为 (a())
就是前面一直都是输入回车,空了很多行后才输入一个字符时,你该怎么处理,我是在Udebug上 一直胡乱输入才发现这样也能出答案...udebug的测试很重要呀。。 (如果用的是gets 输入的话,很方便,遇到\n才会结束,最需要注意的是 刚开始,输入完个数时,当你打下空格的时候,其实gets已经开始读取了,所以str[0]字符数组为空了,不过后面有处理就不用担心了)
--------------------------------------------------------------------------
第二种
1
#
结果为()
第三种,我真是被坑了,主要是没细看题目的意思..有一个很关键的就是这句话
The labels of each of node can be any printable character except for the symbols ‘-’, ‘|’, ‘ ’(space) and ‘#’.
就是不一定都是字母,也可能是‘*’各种ASIIN码,除了上述的四种之外。
-------------------------------------------------------------------------
解题思路:这个题其实不用建树,只需要对着你输入的数组 进行深搜就行了,并且是先序的,一层层递归和回退。(有点像图的 邻接矩阵的遍历,其实本质几乎没区别啦)
--------------------------------------------------------------------------
#include<stdio.h> #include<string.h> char str[250][250]; void dfs(int n,int row,int col1,int col2,int ok) { int i,j1,j2; if(ok && row < n) { printf("("); for(i = col1; i<strlen(str[row]) && i < col2 ;i++) { if(str[row][i]!='|' && str[row][i]!=' ' && str[row][i] != '-'&& str[row][i] != '#' )//在这里由于范围控制的紧密(不会出现一万情况,所以不需要加memset在主函数中清空str数组 { printf("%c",str[row][i]); if(row + 1< n && i< strlen(str[row+1]) && str[row+1][i] == '|' )dfs(n,row+2 ,i,i,0); else printf("()"); } } printf( ")" ); } else if(!ok && row < n) //用于找子节点范围“---”之下包含的都是子节点 { for(j1 = col1;j1>0;j1--) { if(str[row][j1-1]!='-')break; } for(j2 = col1;j2<strlen(str[row]);j2++) if(str[row][j2]!='-')break; dfs(n,row+1,j1,j2,1); } } int main() { int n; scanf("%d",&n); getchar(); int i,j1; while(n--) { i = 0; while(gets(str[i])) { if(str[i][0] == '#')break; i++; } j1=0; while(j1<i) { if(str[j1][0]!='\0')break; j1++; } if(j1==i)printf("()"); else dfs(i,j1,0,strlen(str[j1]),1); printf("\n"); } return 0; }
不知道为什么是Run time 0.000 ,震惊...可能测试的数据太小了吧