pku 3295 Tautology(枚举+递归)
2009-07-30 10:20
281 查看
#include<iostream> #include<string> using namespace std; bool solve(string& WFF); string WFF; bool state[5]; int main() { bool flag; while(cin>>WFF) { if(WFF[0]=='0') return 0; flag=true; for(int i=0;i<=0x1f;i++)//用位运算枚举 p q r s t各种可能的值 { for(int j=0;j<5;j++) { state[j]=(i>>j)&1; } if(solve(WFF)==false) { flag=false; break; } } if(flag) printf("tautology/n"); else printf("not/n"); } } bool solve(string& WFF) { string s1,s2; int len=WFF.length(); if(len==1) return state[WFF[0]-'p']; if(WFF[0]=='N') { s1=WFF.substr(1,len-1); return !solve(s1); } int a=0,b=0;//a记录变量的数量 b记录运算符的数量 for(int i=1;;i++) { if(a<=b)//分解串,当a-b==1说明得到了第一个子串 { if('p'<=WFF[i]&&WFF[i]<='t') { a++; } else if(WFF[i]!='N') b++; } else { s1=WFF.substr(1,i-1);//递归得到子串的值,然后进行运算 s2=WFF.substr(i,len-i); bool m=solve(s1),n=solve(s2); if(WFF[0]=='K') return m&&n; if(WFF[0]=='A') return m||n; if(WFF[0]=='C') return (!m)||(m&&n); if(WFF[0]=='E') return !(m^n); } } }
相关文章推荐
- POJ 3295 Tautology(递归、构造)
- Tautology(POJ 3295)(暴力枚举)
- poj_3295 Tautology(构造+枚举)
- POJ3295 Tautology(栈和枚举的应用)
- POJ 3295 Tautology(枚举 + 构造)
- POJ 3295 ——Tautology 枚举 构造 位运算可优化
- pku 3295 Tautology 第一周训练——递归+枚举
- uva12113 暴力枚举+回溯递归
- 函数调用,枚举和递归
- pku 1753 Flip Game(枚举)
- pku 2531 Network Saboteur(不会搜索,用的枚举)
- 用递归方法实现指定目录的枚举——兼谈File类的使用
- POJ 1753 递归枚举
- 蓝桥杯 带分数 递归 枚举
- 递归枚举排列、组合的C#源码
- [PKU] 1012 Joseph [约瑟夫环,枚举]
- 蓝桥杯C语言培训3 典型问题的递归框架 例题6 代表团出访(组合枚举)
- Tautology(POJ_3295)
- POJ 3295-Tautology(模拟-逻辑表达式)
- POJ 3295:Tautology:恒真命题的判断