一道非常恶心的模拟题。。。。
暴力枚举出所有情况,后缀式求值,如果求出假,就不是重言式。
#include<cstdio> #include<cstring> #include<cstdlib> #include<cstdlib> #include<algorithm> #include<stack> using namespace std; int a[30][7],p,q,r,s,t; char WWF[110]; stack<int>S; void mklist() { int j=0; for(int i1=1;i1>-1;i1--) for(int i2=1;i2>-1;i2--) for(int i3=1;i3>-1;i3--) for(int i4=1;i4>-1;i4--) for(int i5=1;i5>-1;i5--) { //printf("%d %d %d %d %d\n",i1,i2,i3,i4,i5); a[j][0]=i1; a[j][1]=i2; a[j][2]=i3; a[j][3]=i4; a[j][4]=i5; j++; } //printf("%d\n",j); //for(int i=0;i<32;i++) // printf("%d %d %d %d %d\n",a[i][0],a[i][1],a[i][2],a[i][3],a[i][4]); } bool isval(char ch) { switch(ch) { case 'p': S.push(p);return true; case 'q': S.push(q);return true; case 'r': S.push(r);return true; case 's': S.push(s);return true; case 't': S.push(t);return true; } return false; } void op(char ch) { switch(ch) { case 'K': { int x=S.top(); S.pop(); int y=S.top(); S.pop(); S.push(x&&y); break; } case 'A': { int x=S.top(); S.pop(); int y=S.top(); S.pop(); S.push(x||y); break; } case 'C': { int x=S.top(); S.pop(); int y=S.top(); S.pop(); S.push((!x)||y); break; } case 'E': { int x=S.top(); S.pop(); int y=S.top(); S.pop(); S.push(x==y); break; } case 'N': { int x=S.top(); S.pop(); S.push(!x); break; } } return; } bool ju(char st[]) { int len=strlen(st); //bool flag=true; for(int i=0;i<32;i++) { p=a[i][0]; q=a[i][1]; r=a[i][2]; s=a[i][3]; t=a[i][4]; for(int i=len-1;i>=0;i--) { if(!isval(st[i])) op(st[i]); } int ans=S.top(); S.pop(); if(ans==0) { //flag=false; return false; } } return true; } int main() { mklist(); while(scanf("%s",WWF)&&(WWF[0]!='0')) { if(ju(WWF)) printf("tautology\n"); else printf("not\n"); } }