题目链接:https://vjudge.net/problem/POJ-3295
题意:
p
,
q
,
r
,
s
,
t
p,q,r,s,t
p,q,r,s,t都是公式里的变量,
K
,
A
,
N
,
C
,
E
K,A,N,C,E
K,A,N,C,E是运算符。分别代表
a
n
d
,
o
r
,
n
o
t
,
i
m
p
l
i
e
s
,
e
q
u
a
l
and,or,not,implies,equal
and,or,not,implies,equal运算。运算符真值表如下。
p
,
q
,
r
,
s
,
t
p,q,r,s,t
p,q,r,s,t是公式
如果
w
w
w是公式,则
N
w
Nw
Nw也是公式
如果
w
,
x
w,x
w,x是公式,则
K
w
x
,
A
w
x
,
C
w
x
,
E
w
x
Kwx,Awx,Cwx,Ewx
Kwx,Awx,Cwx,Ewx也是公式。
如果一个公式的逻辑值恒为1,这称这个公式为
t
a
u
t
o
l
o
g
y
tautology
tautology。
问题:现在给你一个公式,请你判断它是不是 t a u t o l o g y tautology tautology.
思路:构造法,用栈模拟这个运算过程,算法步骤具体如下:
枚举p,q,r,s,t的取值,复杂度
2
5
2^5
25。
对于每一种取值,从字符串尾部向前遍历,遇到一个字符,如果是遍历,则入栈。如果是运算符,则根据具体的运算符规则操作。(如果是双目运算符,将头两个元素出栈,并作相关运算,将结果压入栈;单目出栈一个,做运算,将结果压入栈)
这样运算到最后栈顶的元素就是运算结果。(你也许需要定义’T’,'F’来在栈中表示1和0)
那么每一种结果都为真,则为
t
a
u
t
o
l
o
g
y
tautology
tautology。否则
n
o
t
not
not
具体见代码:
#include<iostream> #include<stack> #include<cmath> using namespace std; //栈模拟运算。 stack<char>stk; bool is_var(char c){ if(c=='p'||c=='q'||c=='r'||c=='s'||c=='t'||c=='T'||c=='F'){ return true; } else return false; } int bit[7]; int getvalue(char c){ int res; if(c=='p')res=bit[1]; else if(c=='q')res=bit[2]; else if(c=='r')res=bit[3]; else if(c=='s')res=bit[4]; else if(c=='t')res=bit[5]; else if(c=='T')res=1; else if(c=='F')res=0; return res; } int N(int x){ int res=1-x; return res; } int C(int w,int x){ int res; if(w==1&&x==1)res=1; else if(w==1&&x==0)res=0; else if(w==0&&x==1)res=1; else if(w==0&&x==0)res=1; return res; } int main(){ string s; while(cin>>s){ if(s=="0")break; int i,h; int flag=1; for(h=0;h<=pow(2,5)-1;h++) { while(!stk.empty())stk.pop(); //to bit int tem=5; int hh=h; while(1){ bit[tem]=hh&1; tem--; hh>>=1; if(tem==0)break; } //pqrst // p=bit[1]; // q=bit[2]; // r=bit[3]; // s=bit[4]; // t=bit[5]; int len=s.size(); for(i=len-1;i>=0;i--){ //is variable if(is_var(s[i])){ stk.push(s[i]); }//is operator else{ if(s[i]=='K'){ char w=stk.top(); stk.pop(); char x=stk.top(); stk.pop(); int w1,x1; w1=getvalue(w); x1=getvalue(x); int ans=w1&x1; if(ans)stk.push('T'); else stk.push('F'); } if(s[i]=='A'){ char w=stk.top(); stk.pop(); char x=stk.top(); stk.pop(); int w1,x1; w1=getvalue(w); x1=getvalue(x); int ans=w1|x1; if(ans)stk.push('T'); else stk.push('F'); } if(s[i]=='N'){ char w=stk.top(); stk.pop(); int w1=getvalue(w); int ans=N(w1); if(ans)stk.push('T'); else stk.push('F'); } if(s[i]=='C'){ char w=stk.top(); stk.pop(); char x=stk.top(); stk.pop(); int w1,x1; w1=getvalue(w); x1=getvalue(x); int ans=C(w1,x1); if(ans)stk.push('T'); else stk.push('F'); } if(s[i]=='E'){ char w=stk.top(); stk.pop(); char x=stk.top(); stk.pop(); int w1,x1; w1=getvalue(w); x1=getvalue(x); int ans=(w1==x1); if(ans)stk.push('T'); else stk.push('F'); } } } //stk.top(); int w=stk.top(); int ans=getvalue(w); if(ans==0){ flag=0; break; } } if(flag)cout<<"tautology\n"; else cout<<"not\n"; } return 0; }