zoukankan      html  css  js  c++  java
  • [ACM] POJ 3295 Tautology (构造)

    Tautology
    Time Limit: 1000MS   Memory Limit: 65536K
    Total Submissions: 9302   Accepted: 3549

    Description

    WFF 'N PROOF is a logic game played with dice. Each die has six faces representing some subset of the possible symbols K, A, N, C, E, p, q, r, s, t. A Well-formed formula (WFF) is any string of these symbols obeying the following rules:

    • p, q, r, s, and t are WFFs
    • if w is a WFF, Nw is a WFF
    • if w and x are WFFs, Kwx, Awx, Cwx, and Ewx are WFFs.
    The meaning of a WFF is defined as follows:
    • p, q, r, s, and t are logical variables that may take on the value 0 (false) or 1 (true).
    • K, A, N, C, E mean and, or, not, implies, and equals as defined in the truth table below.
    Definitions of K, A, N, C, and E
         w  x   Kwx   Awx    Nw   Cwx   Ewx
      1  1   1   1    0   1   1
      1  0   0   1    0   0   0
      0  1   0   1    1   1   0
      0  0   0   0    1   1   1

    tautology is a WFF that has value 1 (true) regardless of the values of its variables. For example, ApNp is a tautology because it is true regardless of the value of p. On the other hand, ApNq is not, because it has the value 0 for p=0, q=1.

    You must determine whether or not a WFF is a tautology.

    Input

    Input consists of several test cases. Each test case is a single line containing a WFF with no more than 100 symbols. A line containing 0 follows the last case.

    Output

    For each test case, output a line containing tautology or not as appropriate.

    Sample Input

    ApNp
    ApNq
    0

    Sample Output

    tautology
    not

    Source


    解题思路:

    题意为依据输入的不同的字符串。来求这个逻辑表达式的值。

    这里用到了栈,和表达式求值思想类似。从后往前扫面输入的字符串,假设是数(题中的p,q,r,s,t)就进栈。假设是操作符就从栈中取数。运算后再进栈。题中的数p,q,r,s,t仅仅有0,1取值,所以5重循环,对获得的表达式求值。

    遇到0就退出。

    代码:

    #include <iostream>
    #include <string.h>
    #include <stack>
    using namespace std;
    
    string wff;
    int p,q,r,s,t;
    bool ok;
    
    int compute(string str)//栈中的操作
    {
        stack<int>st;
        int len=str.length();
        for(int i=len-1;i>=0;i--)
        {
            if(str[i]=='p')
                st.push(p);
            else if(str[i]=='q')
                st.push(q);
            else if(str[i]=='r')
                st.push(r);
            else if(str[i]=='s')
                st.push(s);
            else if(str[i]=='t')
                st.push(t);
            else if(str[i]=='K')
            {
                int x=st.top();
                st.pop();
                int y=st.top();
                st.pop();
                st.push(x&y);
            }
            else if(str[i]=='A')
            {
                int x=st.top();
                st.pop();
                int y=st.top();
                st.pop();
                st.push(x||y);
            }
            else if(str[i]=='N')
            {
                int x=st.top();
                st.pop();
                st.push(!x);
            }
            else if(str[i]=='C')
            {
                int x=st.top();
                st.pop();
                int y=st.top();
                st.pop();
                st.push(!x||y);
            }
            else if(str[i]=='E')
            {
                int x=st.top();
                st.pop();
                int y=st.top();
                st.pop();
                st.push(x==y);
            }
        }
        return st.top();
    }
    
    
    int main()
    {
        while(cin>>wff&&wff!="0")
        {
            ok=1;
            for(p=0;p<2;p++)//枚举结果。遇到0就退出循环
                for(q=0;q<2;q++)
                    for(r=0;r<2;r++)
                        for(s=0;s<2;s++)
                            for(t=0;t<2;t++)
            {
                if(compute(wff)==0)
                {
                    ok=0;
                    goto label;
                }
            }
            label:
            if(ok)
                cout<<"tautology"<<endl;
            else
                cout<<"not"<<endl;
        }
        return 0;
    }
    


  • 相关阅读:
    SpringBoot项目maven 打包时跳过测试
    scss 学习笔记
    万事都源于一个字:缘
    H To begin or not to begin 题解(思维)
    条件 题解(bitset优化floyd)
    Dima and Salad 题解(01背包变形)
    P1052 [NOIP2005 提高组] 过河 题解(dp+数论优化)
    A Simple Math Problem 题解(数论)
    威佐夫博弈
    P3951 [NOIP2017 提高组] 小凯的疑惑 题解(数论/结论题)
  • 原文地址:https://www.cnblogs.com/gccbuaa/p/7115591.html
Copyright © 2011-2022 走看看