ZJFC-1240
一个比较直白的上下文无关语法分析,传说中是使用编译原理的算法(CYK)进行语法分析的,本人因此查了好多书,晚上看了好久,还是不能明白,诶,难道智力有限.....对于一个不教编译原理这门课的学校....实在无语了,太郁闷了,看书都看不懂.参照了月光和sunny大牛的程序,自己思考了很久,仿照着写了一遍,效率还不错,可惜就是这么一大堆的递归让人很晕,虽然根据题意能解释得通,但还是不能把握全局,郁闷啊郁闷~~~
以下是这题AC的代码
#include <iostream>
using namespace std;
const long MAXN=300;
char key[MAXN];
char List[MAXN][MAXN];
char Set[MAXN][MAXN];
long len;
bool isSet(long,long);
bool isElement(long b,long e)
{
if (b>e)
{
return 0;
}
if (b==e)
{
return 1;
}
return isSet(b,e);

}

bool isList(long b,long e)
{
if (List[b][e])
{
return 'y'==List[b][e];
}
List[b][e]='n';
long i;
for (i=b+1;i<e;++i)
{
if (key[i]==','&&isElement(b,i-1)&&isList(i+1,e))
{
List[b][e]='y';
return 1;
}
}
if (isElement(b,e))
{
List[b][e]='y';
}
return 'y'==List[b][e];
}
bool isElist(long b,long e)
{
if (b>e)
{
return 1;
}
return isList(b,e);
}

bool isSet(long b,long e)
{
if (Set[b][e])
{
return Set[b][e]=='y';
}
if (b<e&&key[b]=='{'&&key[e]=='}')
{
Set[b][e]=isElist(b+1,e-1)?'y':'n';
}
else
{
Set[b][e]='n';
}
return Set[b][e]=='y';
};


int main()
{
long T;
scanf("%ld",&T);
long f=1;
while (T--)
{
memset(List,0,sizeof(List));
memset(Set,0,sizeof(Set));
scanf("%s",key);
len=strlen(key);
printf("Word #%ld: %sSet\n",f,isSet(0,len-1)?"":"No ");
++f;
}
return 0;
}



浙公网安备 33010602011771号