uvaoj10562 Undraw the Trees(一直WA的快来看看)

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



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值