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 ,震惊...可能测试的数据太小了吧