POJ_3295_Tautology(构造法)

http://poj.org/problem?id=3295

/*
题意不难理解,好像是离散的东西,思路就是
从后往前判断,遇见小写字母入栈,大写字母
判断真假值之后(出两个入一个),最后留下的
栈低元素就是式子的真假值。
因为总共有5个字母p,q,r,s,t;每个字母都有可能取值0,1;
因此需要枚举,
在枚举函数中,如果找到一种情况使它不是重言式,便返回零。
*/

 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 }
View Code

 

posted on 2013-08-07 14:22  随风浪子的博客  阅读(193)  评论(0编辑  收藏  举报

导航