• poj 3295 Tautology (构造法)


    大致题意:
    
    输入由p、q、r、s、t、K、A、N、C、E共10个字母组成的逻辑表达式,
    
    其中p、q、r、s、t的值为1(true)或0(false),即逻辑变量;
    
    K、A、N、C、E为逻辑运算符,
    
    K --> :  x && y
    
    A --> :  x || y
    
    N --> not :  !x
    
    C --> implies :  (!x)||y
    
    E --> equals :  x==y
    
    问这个逻辑表达式是否为永真式。
    
    PS:输入格式保证是合法的
    
     
    
    解题思路:
    
    p, q, r, s, t不同的取值组合共32种情况,枚举不同取值组合代入逻辑表达式WFF进行计算。
    
    如果对于所有的取值组合,WFF值都为 true, 则结果为 tautology,否则为 not。 
      
    
    WFF的计算方法:
    
    从字符串WFF的末尾开始依次向前读取字符。
    
    构造一个栈stack,当遇到逻辑变量 p, q, r, s ,t 则将其当前的值压栈;
    
    遇到 N 则取栈顶元素进行非运算,运算结果的值压栈;
    
    遇到K, A, C, E则从栈顶中弹出两个元素进行相应的运算,将结果的值压栈。 
    
    由于输入是合法的,当字符串WFF扫描结束时,栈stack中只剩一个值,该值就是逻辑表达式WFF的值。
    
     
    
     #include<stdio.h>
    #include<stack>
    #include<iostream>
    #include<cstring>
    #define N 1000
    using namespace std;
    stack<int>s;
    int pp,qq,rr,tt,ss;
    int kmp(char c)
    {
        switch(c)
        {
            case 'p':s.push(pp);return 1;
            case 'q':s.push(qq);return 1;
    
            case 'r':s.push(rr);return 1;
    
            case 's':s.push(ss);return 1;
    
            case 't':s.push(tt);return 1;
            default: return 0;
        }
    }
    void ope(char c)
    {
        switch(c)
        {
            case 'K':
            {
                int x=s.top();
                s.pop();
                int y=s.top();
                s.pop();
                s.push(x&&y);
                break;
            }
            case 'A':
            {
                int x=s.top();
                s.pop();
                int y=s.top();
                s.pop();
                s.push(x||y);
                break;
    
            }
            case 'C':
            {
                int x=s.top();
                s.pop();
                int y=s.top();
                s.pop();
                s.push((!x)||y);
                break;
    
            }
             case 'E':
            {
                int x=s.top();
                s.pop();
                int y=s.top();
                s.pop();
                s.push(x==y);
                break;
    
            }
             case 'N':
            {
                int x=s.top();
                   s.pop();
                s.push(!x);
                break;
    
            }
    
        }
    }
    int main()
    {
        char WFF[N];
        int i;
        while(cin>>WFF&&WFF[0]!='0')
        {
            int len=strlen(WFF);
            int flag=1;
            for(pp=0;pp<=1;pp++)//枚举所有情况
            {
                for(qq=0;qq<=1;qq++)
                {
                    for(rr=0;rr<=1;rr++)
                    {
                        for(ss=0;ss<=1;ss++)
                        {
                            for(tt=0;tt<=1;tt++)
                            {
                                for(i=len-1;i>=0;i--)//从尾往前入站
                                {
                                    if(!kmp(WFF[i]))
                                    {
                                        ope(WFF[i]);
                                    }
                                }
                                int ans=s.top();
                                s.pop();
                                if(!ans){flag=0;break;}
                            }
                            if(!flag)break;
                        }
                        if(!flag)break;
                    }
                    if(!flag)break;
                }
                if(!flag)break;
            }
            if(!flag)printf("not\n");
            else printf("tautology\n");
    
        }
    }
    

      

  • 相关阅读:
    汉语-成语:老谋深算
    汉语-成语:深谋远虑
    汉语-词语:审题
    汉语-成语:未雨绸缪
    汉语-成语:精养蓄锐
    汉语-成语:厚积薄发
    汉语-成语:韬光养晦
    汉语-词语:忍耐
    菌类:羊肚菌
    养生-菌类:松露
  • 原文地址:https://www.cnblogs.com/acSzz/p/2367229.html
Copyright © 2020-2023  润新知