首页 > 代码库 > poj 3295 Tautology 伪递归

poj 3295 Tautology 伪递归

题目链接:

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

题目描述:

  给一个字符串,字符串所表示的表达式中p, q, r, s, t表示变量,取值可以为1或0。K, A, N, C, E 分别表示且,或,非,真蕴含,等值。问表达式是不是永真的,如果是输出“tautology”,否则输出“not”。

解题思路:

  这里借用到了递归的本质,也就是对栈的模拟,用递归进行压栈,求表达式的值,再加上对变量状态压缩进行枚举。

 1 #include <cstdio>//本代码用G++交就ac,c++交就wa,因为G++是从前向后求值的,c++是从后向前求值的, 2 #include <cstring> 3 #include <cstdlib> 4 #include <iostream> 5 #include <algorithm> 6 using namespace std; 7 #define maxn 105 8 char str[maxn]; 9 int index;10 11 bool dfs (int num);//对表达式求值12 bool judge ();//对变量的取值进行枚举13 int main ()14 {15     while (scanf ("%s", str), strcmp(str, "0"))16     {17         if (judge ())18             printf ("tautology\n");19         else20             printf ("not\n");21     }22     return 0;23 }24 bool dfs (int num)25 {26     index ++;27     if (str[index] == p)28         return num & 1;29     else if (str[index] == q)30         return (num >> 1) & 1;31     else if (str[index] == r)32         return (num >> 2) & 1;33     else if (str[index] == s)34         return (num >> 3) & 1;35     else if (str[index] == t)36         return (num >> 4) & 1;37     else if (str[index] == K)38         return dfs (num) & dfs (num);//这里的& | 不能用&& ||,因为后者使用时前面的为假就会停止运算,不能达到预计的效果39     else if (str[index] == A)40         return dfs (num) | dfs (num);41     else if (str[index] == N)42         return !dfs (num);43     else if (str[index] == C)44         return !dfs(num) | dfs(num);45     else if (str[index] == E)46         return dfs (num) == dfs(num);47 48 }49 bool judge ()50 {51     int i;52     for (i=0; i<32; i++)53     {54         index = -1;55         if (!dfs (i))56             return 0;57     }58     return 1;59 }

 

poj 3295 Tautology 伪递归