zoukankan      html  css  js  c++  java
  • 构造 + 离散数学、重言式

    Tautology

    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

    A 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


    【题目来源】
    Waterloo Local Contest, 2006.9.30
    http://poj.org/problem?id=3295
    【题目大意】
    给你一个合式公式,让你判断是否为重言式。
    【题目分析】
    这题考了一些离散数学的概念在里面,题目并不难,就是构造加模拟。
    使用一个栈来从后往前计算。

    AC代码:
    #include<iostream>
    #include<cstring>
    #define MAX 110
    using namespace std;
    int a[MAX];
    char str[MAX];
    void calc(int p,int q,int r,int s,int t)
    {
       int top=0;
       int t1,t2;
       int len=strlen(str);
       for(int i=len-1;i>=0;i--) //所有的都判断一遍,直到a[0]
       {
           if(str[i]=='p') a[top++]=p;
      else if(str[i]=='q') a[top++]=q;
      else if(str[i]=='r') a[top++]=r;
      else if(str[i]=='s') a[top++]=s;
      else if(str[i]=='t') a[top++]=t;

           if(str[i]=='K')
           {
              t1=a[--top];
              t2=a[--top];
              a[top++]=t1&&t2;
           }
           else if(str[i]=='A')
           {
              t1=a[--top];
              t2=a[--top];
              a[top++]=t1||t2;
           }
          else if(str[i]=='N')
           {
              t1=a[--top];
              a[top++]=!t1;
           }
          else if(str[i]=='C')
           {
              t1=a[--top];
              t2=a[--top];
              if(t1==1&&t2==0)
                  a[top++]=0;
              else a[top++]=1;
           }
           else if(str[i]=='E')
           {
              t1=a[--top];
              t2=a[--top];
              if(t1==t2)
               a[top++]=1;
              else a[top++]=0;
           }
       }
    }
    bool judge()
    {
       int p,q,r,s,t;
       for(p=0;p<2;p++)                       //枚举所有的情况
        for(q=0;q<2;q++)
         for(r=0;r<2;r++)
          for(s=0;s<2;s++)
           for(t=0;t<2;t++)
           {
               calc(p,q,r,s,t);
               if(a[0]==0)
               {
                   return false;
               }
           }
        return  true;
    }
    int main()
    {
       while(cin>>str)
       {
           if(strcmp(str,"0")==0) break;
           if(judge())
               cout<<"tautology"<<endl;
           else cout<<"not"<<endl;
       }
    }
  • 相关阅读:
    airflow分布式部署(四)airflow环境变量与参数配置
    airflow分布式部署(三)redis安装
    airflow分布式部署(二)mysql安装
    airflow分布式部署(一)Python环境
    向Python脚本传参数
    分类器评估
    线性判别分析
    决策树分类器
    K最近邻分类
    半朴素贝叶斯分类器
  • 原文地址:https://www.cnblogs.com/crazyacking/p/3731215.html
Copyright © 2011-2022 走看看