poj 3295 Tautology (模拟栈操作+状压)

    xiaoxiao2021-04-12  32

    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 WFFsif w is a WFF, Nw is a WFFif 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

    判断一个表达式是否是重言式,所以用状压枚举所有情况,从后往前遍历字符串,用栈模拟

    N !   A ||    K &&    C (!x)||y     E== 

    #include <algorithm> #include <string.h> #include <iostream> #include <stdio.h> #include <string> #include <vector> #include <queue> #include <map> #include <set> #include <stack> using namespace std; typedef long long LL; const int N = 2010; int v[10]; char str[100]; stack<int>q; int main() { while(scanf("%s",str),str[0]!='0') { int flag=1; for(int i=0;i<(1<<5);i++) { memset(v,0,sizeof(v)); for(int j=0;j<5;j++) { if(i&(1<<j)) v[j]=1; } int len=strlen(str); while(!q.empty()) q.pop(); for(int j=len-1;j>=0;j--) { if(str[j]>='p'&&str[j]<='t') q.push((v[str[j]-'p'])); else { if(str[j]=='N') { int tmp=q.top();q.pop(); q.push(!tmp); continue; } else if(str[j]=='A') { int tmp1=q.top();q.pop(); int tmp2=q.top();q.pop(); q.push(tmp1||tmp2); continue; } else if(str[j]=='K') { int tmp1=q.top();q.pop(); int tmp2=q.top();q.pop(); q.push(tmp1&&tmp2); continue; } else if(str[j]=='E') { int tmp1=q.top();q.pop(); int tmp2=q.top();q.pop(); q.push(tmp1==tmp2); continue; } else { int tmp1=q.top();q.pop(); int tmp2=q.top();q.pop(); q.push((!tmp1)||tmp2); continue; } } } if(q.top()==0) { flag=0; break; } } if(flag) puts("tautology"); else puts("not"); } return 0; }

    转载请注明原文地址: https://ju.6miu.com/read-667453.html

    最新回复(0)