POJ 3295 Tautology(构造+模拟)

题目链接

题目大意:给你一个字符串,含有p、q、r、s、t、K 、A、 N、C、E中的一些字符,这些大写字母代表一些运算符满足下表的运算方式,小写字母代表0或1,如果能找到至少一组小写字母的取值,使得这个式子为0,就输出"not",否则输出"tautology"。

分析:根据这个表,我们可以推出K代表&&逻辑运算符,其实因为这里面每个小写字母只能是0或1,所以也可以认为K是&,A代表||,也可以认为是|,N代表!,C代表(!a)|b,也可以认为是(!a)||b,E代表!(a^b)也可以是(a==b),由于只有5个小写字母,且每个只能是0或者是1,那么也就是有2的5次方种情况,因为只有2的5次方种情况,所以可以直接暴力枚举每一种情况。

根据上面所推出的每种大写字母所表示的运算方式,发现其实只有单目运算符和双目运算符两种运算符,而单目运算符优先级又是高于双目运算符的,因此内层的运算总是在表达式末端,对于要求解这类嵌套表达式的值, 最好的数据结构就是栈,从最内层开始计算, 逐层向外推算。然后逆序遍历字符串:

  1. 遇到逻辑变量,则把该逻辑变量的当前值(0或1)直接压入栈中

  2. 遇到逻辑运算符, 则根据它是单目运算符还是双目运算符,从栈顶取出对应的两个逻辑变量或者是一个计算后, 将结果压入栈中。

  3. 只要有一种情况使得表达式的值为0,就输出not,如果每种情况表达式的值都为1,就输出tautology。

  4. #include<map>
    #include<set>
    #include<cmath>
    #include<queue>
    #include<stack>
    #include<cstdio>
    #include<vector>
    #include<cctype>
    #include<cstring>
    #include<cstdlib>
    #include<iostream>
    #include<algorithm>
    #define inf 0x3f3f3f3f
    #define maxn 105
    #define Clear(x) memset(x,0,sizeof(x))
    #define fup(i,a,b) for(int i=a;i<b;i++)
    #define rfup(i,a,b) for(int i=a;i<=b;i++)
    #define fdn(i,a,b) for(int i=a;i>b;i--)
    #define rfdn(i,a,b) for(int i=a;i>=b;i--)
    typedef long long ll;
    using namespace std;
    const double pi=acos(-1.0);
    char str[maxn];
    
    int main()
    {
        int len,x,y;
        stack<int>Q;
        while(~scanf("%s",str)&&str[0]!='0')
        {
            int flag=1;
            while(!Q.empty()) Q.pop();
            len=strlen(str);
            for(int p=0;p<2;p++)
                for(int q=0;q<2;q++)
                    for(int r=0;r<2;r++)
                        for(int s=0;s<2;s++)
                            for(int t=0;t<2;t++)
                            {
                                for(int i=len-1;i>=0;i--)
                                {
                                    if(str[i]=='p') Q.push(p);
                                    else if(str[i]=='q') Q.push(q);
                                    else if(str[i]=='r') Q.push(r);
                                    else if(str[i]=='s') Q.push(s);
                                    else if(str[i]=='t') Q.push(t);
                                    if(str[i]=='K'){
                                        x=Q.top();
                                        Q.pop();
                                        y=Q.top();
                                        Q.pop();
                                        Q.push(x&y);//Q.push(x&&y)也可以
                                    }else if(str[i]=='A'){
                                        x=Q.top();
                                        Q.pop();
                                        y=Q.top();
                                        Q.pop();
                                        Q.push(x|y);//Q.push(x||y)也可以
                                    }else if(str[i]=='N'){
                                        x=Q.top();
                                        Q.pop();
                                        Q.push(!x);
                                    }else if(str[i]=='C'){
                                        x=Q.top();
                                        Q.pop();
                                        y=Q.top();
                                        Q.pop();
                                        Q.push((!x)|y);//Q.push(!(x)||y)也可以
                                    }else if(str[i]=='E'){
                                        x=Q.top();
                                        Q.pop();
                                        y=Q.top();
                                        Q.pop();
                                        Q.push(!(x^y));
                                    }
                                }
                                if(Q.top()==0) flag=0;
                            }
            cout<<(flag?"tautology":"not")<<endl;
        }
        return 0;
    }
    
扫描二维码关注公众号,回复: 2617148 查看本文章

猜你喜欢

转载自blog.csdn.net/qq_41311604/article/details/81414621