原题描述:
描述
一个文法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;
}
写的有些乱,看不懂的地方可以指出。
测试的结果都正确,但提交就是结果错误。不知道哪错了。
请帮我看看哪里有问题,
能给出你的代码就更好了。
谢谢。