Tautology(poj3295)(DFS)

 

本题中最多5个命题变项:p,q,r,s,t

每个有0,1两种取值,所以总共32种情况,分别枚举即可。

对于每种情况,计算表达式的值,如果有结果为0的则输出not

难点在于如何计算表达式的值,我们采用递归的方法,把表达式分为一或两个子表达式,并把参数end(本表达式的结束位置)传给上一层,一遍上一层获取第二个子表达式的起始位置。最后通过两个子表达式的结束位置,得到整个表达式的结束位置。

end是本表达式的最后一位的下标,即本表达式的长度减一。

所以 end = 2 + end1 + end2;

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <string>
 4 #include <cstdlib>
 5 using namespace std;
 6  
 7 string p;
 8 bool v[5];
 9  
10 bool getValue(string p, int &end)
11 {
12     bool a, b;
13     int end1, end2;
14  
15     if (p[0] >= 'p')
16     {
17         end = 0;
18         return v[p[0] - 'p'];
19     }
20     if (p[0] == 'N')
21     {
22         a = getValue(p.substr(1, p.length() - 1), end1);
23         end = end1 + 1;
24         return !a;
25     }
26     a = getValue(p.substr(1, p.length() - 1), end1);
27     b = getValue(p.substr(end1 + 2, p.length() - 1), end2);
28     end = 2 + end1 + end2;
29     switch (p[0])
30     {
31     case 'K':
32         return a && b;
33     case 'A':
34         return a || b;
35     case 'C':
36         return !a || b;
37     case 'E':
38         return !(a ^ b);
39     }
40     return 0;
41 }
42  
43 int main()
44 {
45     bool ok;
46  
47     while (getline(cin, p) && p[0] != '0')
48     {
49         ok = true;
50         for (int i = 0; i < 32; i++)
51         {
52             for (int j = 0; j < 5; j++)
53                 v[j] = (i >> j) % 2;
54             int x;
55             if (!getValue(p, x))
56             {
57                 ok = false;
58                 break;
59             }
60         }
61         if (ok)
62             cout << "tautology" << endl;
63         else
64             cout << "not" << endl;
65     }
66     return 0;
67 }

 转自http://www.cnblogs.com/rainydays/archive/2011/02/01/1948678.html

posted @ 2013-01-30 20:25  再见~雨泉  阅读(265)  评论(0编辑  收藏  举报