放下代码,识别尾部以01结尾的0和1的串 自动机NFA实现
#include <stdio.h>#include <stdlib.h>
#include <string.h>
int get_one_char(char *str,int i)
{
if(*(str+i)=='\0')
return 3;
if(*(str+i)=='0')
return 0;
if(*(str+i)=='1')
return 1;
}
void query_table(int a[3],int (*statustable[3][2])[3],int one_zero)
{
int b[3]={3,3,3};
int i=0,j;
for(j=0;i<3;i++){
if(a[i]!=3){
for(j=0;j<3;j++){
if(statustable[a[i]][one_zero]!=NULL){
if((b[j]!=*(*statustable[a[i]][one_zero]+j))&&*(*statustable[a[i]][one_zero]+j)!=3)
b[j]=*(*statustable[a[i]][one_zero]+j);
}
}
}
}
for(i=0;i<3;i++){
a[i]=b[i];
}
}
int give_result(int a[3])
{
int i,n=0;
for(i=0;i<3;i++)
if(a[i]==2){
n=1;
}
if(n==1)
return 1;
else
return 0;
}
int main()
{
int a[3][3]={{0,1,3},
{0,3,3},
{3,3,2}
};
int (*(b[3][2]))[3]={{a+0,a+1},
{NULL,a+2},
{a+2,a+2}
};
int statu[3],i,c,m=1,h;
char str[100];
for(i=0;i<3;i++){
statu[i]=a[1][i];
}
scanf("%s",str);
i=0;
while((c=get_one_char(str,i))!=3){
if(m>1){
statu[2]=3;
}
query_table(statu,b,c);
if(give_result(statu)){
m++;
}
//for(h=0;h<3;h++)
// printf("%d",statu[h]);
// printf("\n");
i++;
}
if(give_result(statu) )
printf("yes!\n");
else
printf("no!\n");
}