POJ_3295_Tautology(构造法)
http://poj.org/problem?id=3295
/*
题意不难理解,好像是离散的东西,思路就是
从后往前判断,遇见小写字母入栈,大写字母
判断真假值之后(出两个入一个),最后留下的
栈低元素就是式子的真假值。
因为总共有5个字母p,q,r,s,t;每个字母都有可能取值0,1;
因此需要枚举,
在枚举函数中,如果找到一种情况使它不是重言式,便返回零。
*/
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 # include <stdio.h> 2 # include <string.h> 3 int p,q,r,s,t; 4 struct node 5 { 6 int top; 7 int data[120]; 8 }sq; 9 void solve(char *str) 10 { 11 int i; 12 int len; 13 int t1,t2; 14 len=strlen(str); 15 sq.top=0; 16 for(i=len-1;i>=0;i--) 17 { 18 if(str[i]=='p') 19 sq.data[sq.top++]=p; 20 else if(str[i]=='q') 21 sq.data[sq.top++]=q; 22 else if(str[i]=='r') 23 sq.data[sq.top++]=r; 24 else if(str[i]=='s') 25 sq.data[sq.top++]=s; 26 else if(str[i]=='t') 27 sq.data[sq.top++]=t; 28 else if(str[i]=='K') 29 { 30 t1=sq.data[--sq.top]; 31 t2=sq.data[--sq.top]; 32 sq.data[sq.top++]=t1&&t2; 33 } 34 else if(str[i]=='A') 35 { 36 t1=sq.data[--sq.top]; 37 t2=sq.data[--sq.top]; 38 sq.data[sq.top++]=t1||t2; 39 } 40 else if(str[i]=='N') 41 { 42 t1=sq.data[--sq.top]; 43 sq.data[sq.top++]=!t1; 44 } 45 else if(str[i]=='C') 46 { 47 t1=sq.data[--sq.top]; 48 t2=sq.data[--sq.top]; 49 sq.data[sq.top++]=!t1||t2; 50 } 51 else if(str[i]=='E') 52 { 53 t1=sq.data[--sq.top]; 54 t2=sq.data[--sq.top]; 55 sq.data[sq.top++]=(t1&&t2)||(!t1&&!t2); 56 } 57 58 } 59 } 60 int get(char *str) 61 { 62 for(p=0;p<=1;p++) 63 for(q=0;q<=1;q++) 64 for(r=0;r<=1;r++) 65 for(s=0;s<=1;s++) 66 for(t=0;t<=1;t++) 67 { 68 solve(str); 69 if(sq.data[0]==0) 70 return 0; 71 } 72 return 1; 73 } 74 int main() 75 { 76 char s[120]; 77 while(scanf("%s",s) != EOF) 78 { 79 if(strcmp(s,"0") == 0) 80 break; 81 else 82 { 83 if(get(s)) 84 printf("tautology\n"); 85 else 86 printf("not\n"); 87 } 88 } 89 return 0; 90 }