加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

有穷自动机

发布时间:2020-12-14 00:56:36 所属栏目:百科 来源:网络整理
导读:ADFA 的可判定性 Problemdescription ADFA={B,w|B是DFA,w是串,B接收w}证明:ADFA是可判定的。实验方法:编写一个算法/程序,对于任意给定的输入B,W,可以判定ADFA。 Input 有多个测试序列,测试结束于测试文件结束;每个测试序列的第一行为几个正整数nmta分

ADFA的可判定性

Problemdescription

ADFA={<B,w>|B是DFA,w是串,B接收w}证明:ADFA是可判定的。实验方法:编写一个算法/程序,对于任意给定的输入<B,W>,可以判定ADFA。

Input

有多个测试序列,测试结束于测试文件结束;每个测试序列的第一行为几个正整数nmta分别表示有n个状态,从a开始m个小写字母组成的字符集,第一个状态默认为起始状态。t个接受状态和a个测试串,接下来为一个n行m列的矩阵S,其中S[i][j]表示第i行第j列,意义为状态i经过字母j到达状态S[i][j]。接下来有t个数字,表示t个接受状态值,然后是a行,每行一个串表示待测试的串。

Output

对于每个字符串输出YES表示该DFA接受该串,NO表示不接受。

SampleInput

3312

232

333

333

2

a

b

SampleOutput

YES

NO

对于这个问题,我们需要知道DFA是什么,以及它的运行原理是怎样的。

DFA及其原理


有穷自动机例子:


那么M1识别正则语言A={w|w至少含有一个1并且在最后的1后面有偶数个0}

那么DFA是什么呢?对,DFA是确定型的有穷自动机,意思就是当机器处于给定的状态并读入下一个输入符号时,可以知道机器的下一个状态是什么。

然后我们可以把上题的描述转换成一个DFAM1=Q,,,F),其中

①Q={123}

②={abc}

③描述为


④1是起始状态。

⑤F={2}

有穷自动机:



我们把问题搞清楚了,那么久可以开始写代码了。

代码如下:

#include<iostream>
#include<malloc.h>
#include<string.h>
using namespace std;
class DFA{
private:
int num_Q;//状态个数
int acc_Q[100];//接受状态集合
int t;//接受状态个数 
int start_Q;//起始状态
int num_E;//字母表个数
int next_E[100][100];//转移函数
public:
void Init(int n,int m,int t,int accept[],int s[100][100]){//初始化DFA 
num_Q=n;
num_E=m;
for(int i=0;i<t;i++)
acc_Q[i]=accept[i];
start_Q=1;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
next_E[i][j]=s[i][j];
}
}
this->t=t;
}
bool go(char* w){//接受字符串的运行结果
bool result=false;//运行结果 
int q=start_Q;//当前状态
for(int i=0;i<strlen(w);i++){
q=next_E[q-1][w[i]-'a'];
}
for(int i=0;i<t;i++){
if(q==acc_Q[i])
result=true;
}
return result;
}
};
int main(){
int n,m,t,a,s[100][100],accept[100];
char test[100][100],ch;
while(cin>>n>>m>>t>>a){
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>s[i][j];
}
}
for(int i=0;i<t;i++){
cin>>accept[i];
}
for(int i=0;i<a;i++){
cin>>test[i];
}
//验证
DFA dfa;
dfa.Init(n,accept,s);
for(int i=0;i<a;i++){
if(dfa.go(test[i]))
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
}
return 0;
} 

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读