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