骏域网站建设专家东莞,汉中市建设工程造价信息,顺德装修网站建设,wordpress加广告本题中最多5个命题变项#xff1a;p,q,r,s,t 每个有0,1两种取值#xff0c;所以总共32种情况#xff0c;分别枚举即可。 对于每种情况#xff0c;计算表达式的值#xff0c;如果有结果为0的则输出not 难点在于如何计算表达式的值#xff0c;我们采用递归的方法#xff0… 本题中最多5个命题变项p,q,r,s,t 每个有0,1两种取值所以总共32种情况分别枚举即可。 对于每种情况计算表达式的值如果有结果为0的则输出not 难点在于如何计算表达式的值我们采用递归的方法把表达式分为一或两个子表达式并把参数end本表达式的结束位置传给上一层一遍上一层获取第二个子表达式的起始位置。最后通过两个子表达式的结束位置得到整个表达式的结束位置。 end是本表达式的最后一位的下标即本表达式的长度减一。 所以 end 2 end1 end2; 1 #include iostream2 #include cstdio3 #include string4 #include cstdlib5 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转载于:https://www.cnblogs.com/gj-Acit/archive/2013/01/30/2883618.html