poj 3295 Tautology (构造)
题目:http://poj.org/problem?id=3295
题意:p,q,r,s,t,是五个二进制数。
K,A,N,C,E,是五个运算符。
K:&&
A:||
N:!
C:(!w)||x
E:w==x
题意是让求如果对于五个数的所有情况一个式子总是恒为1,那么这个式子就是tautology。输出tautology。
否则输出not。
5个数,最多有2^5种情况。
判断式子是不是恒为1,只需要从后往前判断即可。
这题好长时间没看懂,代码也是看网上大神的
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<cstdlib> 5 #include<algorithm> 6 using namespace std; 7 char str[110]; 8 int stack[110]; 9 10 int check() 11 { 12 int pp,qq,rr,ss,tt,n,i,top; 13 n=strlen(str); 14 for(pp = 0; pp < 2; pp++) 15 for(qq = 0; qq < 2; qq++) 16 for(rr = 0; rr < 2; rr++) 17 for(ss = 0; ss < 2; ss++) 18 for(tt = 0; tt < 2; tt++) 19 { 20 top = 0; 21 for(i = n-1; i >= 0; i--) 22 { 23 if(str[i]=='q') stack[top++]=qq; 24 if(str[i]=='p') stack[top++]=pp; 25 if(str[i]=='r') stack[top++]=rr; 26 if(str[i]=='t') stack[top++]=tt; 27 if(str[i]=='s') stack[top++]=ss; 28 if(str[i]=='K') top--,stack[top-1]=(stack[top-1]&&stack[top]); 29 if(str[i]=='A') top--,stack[top-1]=(stack[top-1]||stack[top]); 30 if(str[i]=='N') stack[top-1]=!stack[top-1]; 31 if(str[i]=='C') top--,stack[top-1]=((!stack[top-1])||stack[top]); 32 if(str[i]=='E') top--,stack[top-1]=((stack[top-1])==stack[top]); 33 } 34 if(top!=1||stack[top-1]!=1) 35 return 0; 36 } 37 38 return 1; 39 }; 40 41 int main() 42 { 43 while(gets(str)&&str[0]!='0') 44 { 45 if(check()) 46 cout<<"tautology"<<endl; 47 else 48 cout<<"not"<<endl; 49 } 50 return 0; 51 } 52