题目链接:https://vjudge.net/contest/369436#problem/A
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.
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
翻译:
输入一个由p、q、r、s,t,K、A、N、C、E组成的字符串。
其中p、q、r、s、t的值为1(true)或0(false),即逻辑变量;
K、A、N、C、E为逻辑运算符,
K --> and:x && y
A --> or:x || y
N --> not :! x
C --> implies : (!x)||y
E --> equals :x==y
问这个逻辑表达式是否为永真式。
分析:
从后往前,枚举逻辑变量的值。
代码:
#include<cstdio>
#include<cstring>
#include<stack>
#include<math.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
const int N=1e2+10;
char ch[N];
stack<int>st;
int main()
{
while(~scanf("%s",ch))
{
int res=0;
if(ch[0]=='0')
break;
while(st.size()>0)
st.pop();
int len=strlen(ch);
for(int p=0; p<=1; p++)
{
for(int q=0; q<=1; q++)
{
for(int r=0; r<=1; r++)
{
for(int s=0; s<=1; s++)
{
for(int t=0; t<=1; t++)
{
for(int i=len-1; i>=0; i--)
{
if(ch[i]>='a'&&ch[i]<='z')
{
if(ch[i]=='p')
st.push(p);
else if(ch[i]=='q')
st.push(q);
else if(ch[i]=='r')
st.push(r);
else if(ch[i]=='s')
st.push(s);
else if(ch[i]=='t')
st.push(t);
}
else if(ch[i]>='A'&&ch[i]<='Z')
{
if(ch[i]=='K')
{
int index1=st.top();
st.pop();
int index2=st.top();
st.pop();
st.push(index1&index2);
}
else if(ch[i]=='A')
{
int index1=st.top();
st.pop();
int index2=st.top();
st.pop();
st.push(index1|index2);
}
else if(ch[i]=='N')
{
int index1=st.top();
st.pop();
st.push(!index1);
}
else if(ch[i]=='C')
{
int index1=st.top();
st.pop();
int index2=st.top();
st.pop();
if(!index1&&index2)
st.push(0);
else
st.push(1);
}
else if(ch[i]=='E')
{
int index1=st.top();
st.pop();
int index2=st.top();
st.pop();
int p=index1==index2?1:0;
st.push(p);
}
}
}
if(st.top()==0)
res++;
}
}
}
}
}
if(res==0)
printf("tautology\n");
else
printf("not\n");
}
return 0;
}