zoukankan      html  css  js  c++  java
  • 湖大OJ-实验E----可判定的DFA的空问题

    实验E----可判定的DFA的空问题
    Time Limit: 1000ms, Special Time Limit:2500ms, Memory Limit:32768KB
    Total submit users: 138, Accepted users: 130
    Problem 13122 : No special judgement
    Problem description

      EDFA={< B >|B是DFA,且L(A)=Ф} 证明:EDFA是可判定的语言。 实验方法:编写一个算法/程序,对于任意给定的输入(/确定性有限状态自动机DFA),可以判定EDFA

    Input

      有多个测试序列,测试结束于测试文件结束;
      每个测试序列相对应一个DFA,其第一行为2个正整数n,m,表示有n个状态,状态集Q={q0,q1,…,qn-1}。默认起始状态为q0,字符集有m个字符。0 < n,m ≤100。随后n行,每行m个空格隔开的整数δij,( 0 ≤ i < n , 0 ≤ j < m )表示DFA的状态转移函数。δij表示第i个状态在输入j(字母表第j个字符)时,变为第δij个状态。每个DFA的最后一行,首先一个整数f,表示接受状态数,然后f个空格隔开的整数fk(0 ≤ k < f),是所有接受状态的编号。其中 0 ≤ δij,fk < n。

    Output

      对于每个输入的DFA,输出”YES”,如果该DFA确实不接受任何串;否则,输出”NO”。 

    Sample Input
      1 2
      0 0
      1 0
      1 2
      0 0
      0
    
    Sample Output
      NO
      YES
    
    Judge Tips

      样例中2个DFA,第一个是接受所有输入的DFA,第二个是拒绝所有输入的DFA,所以,第一个DFA输出”NO”,而第二个是”YES”。

    1、算法设计思路

      A: <DFA  B>是否接受w的问题。ADFA是可判定的。ANFA是可判定的。ARES是可判定的。EDFA是可判定的。EQDFA是可判定的。P100。核心思想:图灵机跟踪DFA的状态和当前位置,状态和位置的变化由转移函数决定。

      B: DFA不接受任意串存在以下几种情况:没有接受状态、接受状态独立、接受状态和起始状态不在同一个团中;基于以上三种情况编写代码

    2、实验总结

    不要去根据DFA可能接受某一个串去判断一个DFA大的可判定性,而是从相反的方向来考虑问题:即判断DFA是否拒绝所有的串。DFA拒绝所有的串只可能存在以上三种情况。

    3、AC代码

    #include<cstdio>
    #include<cstdlib>
    #include<iostream>
    #include<cstring>
    using namespace std;
    bool vis[110];
    bool ac[110];
    int num[110][110];
    int n, m, f, p, cnt;
    bool dfs(int k)
    {
        vis[k] = 1;
        if(ac[k])
        {
            return 1;
        }
        for(int i = 0; i < m; i++)
            if(!vis[num[k][i]] && dfs(num[k][i]))
            {
                return 1;
            }
        return 0;
    }
    int main()
    {
        while(scanf("%d%d", &n, &m)!=EOF)
        {
            memset(vis, 0, sizeof(vis));
            memset(ac, 0, sizeof(ac));
            for(int i = 0; i < n; i++)
                for(int j = 0; j < m; j++)
                    scanf("%d", &num[i][j]);
            scanf("%d", &f);
            for(int i = 0; i < f; i++)
            {
                scanf("%d", &p), ac[p] = 1;
            }
            if(f)
                if(dfs(0))
                    printf("NO
    ");
                else
                    printf("YES
    ");
            else
                printf("YES
    ");
        }
        return 0;
    }
  • 相关阅读:
    artdialog4.1.7 中父页面给子页面传值
    Sql Server按树形结构排序查询表记录
    js控制滚动条平滑滚动到制定位置
    sql实现对多个条件分组排序方法和区别
    css渐变颜色在线制作
    c#中文转全拼或首拼
    Aspose Cells 添加数据验证(动态下拉列表验证)
    jQuery 插件autocomplete
    导出excel时,以form方式提交json数据
    asp.Net2.0中TextBox设置只读后后台获取不到值的解决方法
  • 原文地址:https://www.cnblogs.com/pengfeiz/p/5974680.html
Copyright © 2011-2022 走看看