• 湖大OJ-实验A---- ADFA的可判定性


    实验A---- ADFA的可判定性
    Time Limit: 1000ms, Special Time Limit:2500ms, Memory Limit:32768KB
    Total submit users: 326, Accepted users: 305
    Problem 12595 : No special judgement
    Problem description

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

    Input

      有多个测试序列,测试结束于测试文件结束; 每个测试序列的第一行为几个正整数n m t a分别表示有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表示不接受。

    Sample Input
      3 3 1 2
      2 3 2
      3 3 3
      3 3 3
      2
      a
      b
    Sample Output
      YES
      NO

    1、算法设计思路

    A: 首先将输入的状态转移矩阵保存在S数组中,其中其中S[i][j]表示第i行第j列,意义为状态i经过字母j到达状态S[i][j]。

    B: 对每一个输入的串W,从after(after表示每次转换后的状态,初始为起始状态)开始,按照每一个字符,得到相应的后继状态,保存在after中。

    C: 最后判断accept[after]的值,即串在DFA上运行之后最终状态是否可接受。

    2、实验总结

    总的来说这一题比较容易(有点太水了),只要把输入串的每一个字符按照前面的状态得到后继状态,并不断的走下去,直到串的最后一个字符,就可以得到最后的状态,再根据其是否处在接受态,给出相应的输出

    3、AC代码

    #include <iostream>
    #include <cstring>
    using namespace std;
    long n,m,t,a;
    long s[1000][1000]; //存储转移矩阵
    long accept[1000];  //存储接受状态
    int main(){
        while(cin>>n>>m>>t>>a){
            memset(s,0,sizeof(s));
            memset(accept,0,sizeof(accept));
            for(int i = 1;i<=n;i++){
                for(int j = 1;j<=m;j++)
                    cin>>s[i][j];
            }
            for(int i = 0;i<t;i++){
                long temp;
                cin>>temp;
                accept[temp] = 1;
            }
            while(a--){
                string temps;
                cin>>temps;
                int after = 1;
                for(int i = 0;i<temps.length();i++){
                    after = s[after][temps[i]-'a'+1];
                }
                if(accept[after]==1)
                    cout<<"YES"<<endl;
                else
                    cout<<"NO"<<endl;
            }   }
        return 0;
    }
  • 相关阅读:
    python print 在命令行打印带颜色
    Cython 一篇通
    gcc 内置函数
    gcc 内置函数
    #define xxx do{...} while(0) 宏定义
    防止cpu 一直被占用 sleep(0) 和 yield
    golang之archive/tar包的使用
    go+mysql实现页面的增删改查练习
    设计模式之访问者模式
    设计模式之模板模式(PHP实现)
  • 原文地址:https://www.cnblogs.com/pengfeiz/p/5123718.html
Copyright © 2020-2023  润新知