【求助】ACM题!!!快疯了,总是结果错误

xiaosaner3 2009-06-11 10:36:52

原题描述:
描述

一个文法G[Z]有如下五条规则:
(1)Z→(U)
(2)Z→aUb
(3)U→dZ
(4)U→bU
(5)U→e
由此文法可以产生语言:比如:ad(be)b就是此文法的语言,因为有如下推导序列:
Z→aUb→adZb→ad(U)b→ad(bU)b→ad(be)b
输入
有n+1行,第一行为测试数据的组数n。 下面有n行,每行为一个字符串。

输出
对每一组测试数据有一行输出,如果语言Σ是G[Z]产生的语言,则输出"Yes."如果不是则 输出"No".
样例输入
2
abcsdf324sd
ad(be)b
样例输出
No.
Yes.
提示
运用递归。

网站在这:
http://acm.buaa.edu.cn/oj/problem_show.php?c=0&p=10075

我的程序:


#define _CRT_SECURE_NO_DEPRECATE
#include<stdio.h>
#include<string.h>

int len = 0;
void f(char *s,char c,int l,int h)
{
if( c == 'U')
{
if( l==-1)
{
printf("No.\n");return;
}
if( s[l] == 'b')//bU --U
{
f(s,'U',l-1,h);return;
}
else if( (s[l] == '(' && s[h] == ')' ) ||( s[l] == 'a' && s[h] == 'b' ) )//(U) 或aUb
{
f(s,'Z',l-1,h+1);return;
}
printf("No.\n");
}
else if( c == 'Z')
{
if( l == -1 && h == len)
{
printf("Yes.\n");return;
}
else
{
if( l == -1)
{
printf("No.\n");return;
}
else
{
if(s[l] == 'd') //dZ
{
f(s,'U',l-1,h);
}
else
{
printf("No.\n");return;
}
}
}
}
}

int main()
{
int yy,i ;
scanf("%d",&yy);
char s[100000];
for(;yy>0;yy--)
{
scanf("%s",s);
len = strlen(s);
int flag = 0 ;
for(i=0;i<len;i++)
{
if(s[i] == 'e' || s[i] == 'U')
{
f(s,'U',i-1,i+1);
flag = 1;
break;
}
else if(s[i] == 'Z')
{
f(s,'Z',i-1,i+1);
flag = 1;
break;
}
}
if( flag == 0)
printf("No.\n");

}
return 0;
}


写的有些乱,看不懂的地方可以指出。

测试的结果都正确,但提交就是结果错误。不知道哪错了。

请帮我看看哪里有问题,

能给出你的代码就更好了。

谢谢。
...全文
167 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaosaner3 2009-06-12
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 warren258 的回复:]
acm题目最可恶的是他给的几个用例通过,在oj上却总是不能ac,自己根本就不知道错在什么地方。我就经常遇到这种情况,楼主要有耐心。
[/Quote]

我是很有耐心了,做这一道题上就花了3个小时,半个小时写代码,两个多小时找错。

找不出来,所以来请求大家的帮助。
xiaosaner3 2009-06-12
  • 打赏
  • 举报
回复
回3楼,编译确实没问题,就是我的程序不符合题目的要求,只是不知道哪不符合。

回4楼,不是超时,如果是超时,它会说:超过时间限制
光宇广贞 2009-06-12
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 warren258 的回复:]
acm题目最可恶的是他给的几个用例通过,在oj上却总是不能ac,自己根本就不知道错在什么地方。我就经常遇到这种情况,楼主要有耐心。
[/Quote]

不过还是要说两句。

8楼的同学,你不太了解ACM吧,给你的测试用例算什么,那是哄你的,他后台藏着几个很变态的测试用例,你是不知道的,而那些个专门用来测试你的 TLE 啦、MLE 啦之类的,我觉得 WA 算是可以接受的反馈,TMD 错误 RE 才是最恼人的。

我曾参加过一家公司的笔试玩儿,5 + 1 道算法题,我过了四个,一个超时,一个什么别的错误来着,好在没有WA。列出来的清单还是很详细的。

出现 WA 者,一定是有哪些情况你没有考虑到。你认为你是很正确的,是因为你的“正确”是局限在某个范围内,不包含后台变态用例的……

回 5 楼 LOADEN 前辈,北航的ACM还是很牛X的,比北邮强,亲身感受,呵呵,不过他们的ACM系统的确是很……也是亲身感受,呵呵……
光宇广贞 2009-06-12
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 pathuang68 的回复:]
ACM之于计算机技术,略等于八股文之于经济之学。

估计有人要拍砖了...
[/Quote]

我挺你……做北大过的题,到杭电TMD的WA……
光宇广贞 2009-06-12
  • 打赏
  • 举报
回复
[Quote=引用楼主 xiaosaner3 的帖子:]
http://acm.buaa.edu.cn/oj/problem_show.php?c=0&p=10075
[/Quote]

BUAA,北航……
hjjdebug 2009-06-12
  • 打赏
  • 举报
回复
八股文,不是白话! 抛砖睡觉!
lzr4304061988012 2009-06-12
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 warren258 的回复:]
acm题目最可恶的是他给的几个用例通过,在oj上却总是不能ac,自己根本就不知道错在什么地方。我就经常遇到这种情况,楼主要有耐心。
[/Quote]
这样不是浪费人的时间么?
我最觉得ACM不是的地方就是:出现wrong answer的时候不能告诉你是哪组数据导致错误的,有必要这样吗?
xiaosaner3 2009-06-12
  • 打赏
  • 举报
回复
回楼上,我试过gets,确实还是没过。

真的不知道哪里有问题

直接学习你正确的思路吧
谢谢你
也谢谢其他人。
liao05050075 2009-06-12
  • 打赏
  • 举报
回复
抽空帮你做了一下题目,发现这题目其实挺水的。下面是我的代码,你自己参考看看。

/*
1 87175 liao14 44 KB 2 MS g++ 924B 2009-06-12 15:23

一个文法G[Z]有如下五条规则:
(1)Z→(U)
(2)Z→aUb
(3)U→dZ
(4)U→bU
(5)U→e
由此文法可以产生语言:比如:ad(be)b就是此文法的语言,因为有如下推导序列:
Z→aUb→adZb→ad(U)b→ad(bU)b→ad(be)b

*/
#include <iostream>
using namespace std;
char s[10000];

bool ok;

void solve(char ch,char *p,char *q)
{
if(q<p) return;
if(ch=='Z')
{
if((*p)=='(' && (*q)==')') solve('U',p+1,q-1);
else if((*p)=='a' && (*q)=='b') solve('U',p+1,q-1);
else return;
}
else
{
if((*p)=='d') solve('Z',p+1,q);
else if((*p)=='b') solve('U',p+1,q);
else if(p==q && (*p)=='e')
{
ok=1;
return;
}
}
}

int main()
{
//freopen("in.txt","r",stdin);
int c;
scanf("%d\n",&c);
while(c--)
{
gets(s);
ok=0;
solve('Z',s,strlen(s)+s-1);
if(ok) puts("Yes.");
else puts("No.");
}
return 0;
}


ps.你的程序在一行文本中出现空格的时候会挂掉,因为你用的是scanf,但是改成用gets之后还是没有过,估计你的程序还有其它的bugs
warren258 2009-06-11
  • 打赏
  • 举报
回复
acm题目最可恶的是他给的几个用例通过,在oj上却总是不能ac,自己根本就不知道错在什么地方。我就经常遇到这种情况,楼主要有耐心。
「已注销」 2009-06-11
  • 打赏
  • 举报
回复
结果错误,换成GCC,运行通过,但提交也错误。
不行了,要睡觉了。
pathuang68 2009-06-11
  • 打赏
  • 举报
回复
ACM之于计算机技术,略等于八股文之于经济之学。

估计有人要拍砖了...
「已注销」 2009-06-11
  • 打赏
  • 举报
回复
特意注册了个用户名,我提交了,让我等待,要等到什么时候?
#define _CRT_SECURE_NO_DEPRECATE
#include<stdio.h>
#include<string.h>

int len = 0;
void f(char *s, char c, int l, int h)
{
if (c == 'U')
{
if (l == -1)
{
printf("No.\n");return;
}
if (s[l] == 'b')//bU --U
{
f(s, 'U', l - 1, h);return;
}
else if ((s[l] == '(' && s[h] == ')') || (s[l] == 'a' && s[h] == 'b')) //(U) 或aUb
{
f(s, 'Z', l - 1, h + 1);return;
}
printf("No.\n");
}
else if (c == 'Z')
{
if (l == -1 && h == len)
{
printf("Yes.\n");return;
}
else
{
if (l == -1)
{
printf("No.\n");return;
}
else
{
if (s[l] == 'd') //dZ
{
f(s, 'U', l - 1, h);
}
else
{
printf("No.\n");return;
}
}
}
}
}

int main()
{
int yy, i ;
scanf("%d", &yy);
char s[100000];
for (;yy > 0;yy--)
{
scanf("%s", s);
len = strlen(s);
int flag = 0 ;
for (i = 0;i < len;i++)
{
if (s[i] == 'e' || s[i] == 'U')
{
f(s, 'U', i - 1, i + 1);
flag = 1;
break;
}
else if (s[i] == 'Z')
{
f(s, 'Z', i - 1, i + 1);
flag = 1;
break;
}
}
if (flag == 0)
printf("No.\n");

}
return 0;
}
Ryanwen 2009-06-11
  • 打赏
  • 举报
回复
应该是超时了

「已注销」 2009-06-11
  • 打赏
  • 举报
回复
提交错误并不代表你写错了。编译通过,VC10:
2
abcsdf324sd
No.
ad(be)b
Yes.

Process returned 0 (0x0) execution time : 31.656 s
Press any key to continue.
满衣兄 2009-06-11
  • 打赏
  • 举报
回复
UP++
healer_kx 2009-06-11
  • 打赏
  • 举报
回复
UP

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧