poj3295 栈+递归的使用
2014-11-19 21:16
316 查看
//poj3295 判断是否永真式 情况很多很复杂 必须用特殊的数据结构 //栈+递归的使用 5个变量取值的全部情况 32种情况都是真才是tautology //好开心,居然一次AC。。 #include <iostream> #include <cmath> #include <string> using namespace std; char stack[105]; int top = 0; string ss[32] = { "00000", "00001", "00010", "00011", "00100", "00101", "00110", "00111", "01000", "01001", "01010", "01011", "01100", "01101", "01110", "01111", "10000", "10001", "10010", "10011", "10100", "10101", "10110", "10111", "11000", "11001", "11010", "11011", "11100", "11101", "11110", "11111" }; bool var(char c) { if(c == '1' || c == '0') return true; return false; } char not2(char c) { if(c == '1') return '0'; else return '1'; } char and2(char c, char c2) { if(c=='1' && c2=='1') return '1'; else return '0'; } char or2(char c, char c2) { if(c == '0' && c2 == '0') return '0'; else return '1'; } char implies2(char c, char c2) { if(c == '1' && c2 == '0') return '0'; else return '1'; } char equals2(char c, char c2) { if(c != c2) return '0'; else return '1'; } bool deal(int i, int j) { if(i == j) { if(stack[i] == '1') return true; else return false; } int k = i; while(var(stack[k--])); k++; if(stack[k] == 'N') { stack[k] = not2(stack[k+1]); for(int m = k+2; m <= i; m++) { stack[m-1] = stack[m]; } return deal(i-1, j); } else if(var(stack[k+1]) && var(stack[k+2])) { switch(stack[k]) { case 'K': stack[k] = and2(stack[k+1], stack[k+2]); break; case 'A': stack[k] = or2(stack[k+1], stack[k+2]); break; case 'C': stack[k] = implies2(stack[k+1], stack[k+2]); break; case 'E': stack[k] = equals2(stack[k+1], stack[k+2]); break; } for(int m = k + 3; m <= i; m++) { stack[m-2] = stack[m]; } return deal(i-2, j); } } int main() { string a; getline(cin, a); while(a.compare("0") != 0) { bool ok = true; for(int j = 0; j < 32; j++) { memset(stack, 0, sizeof(stack)); top = 0; for(int i = 0; i < a.length(); i++) { //替换变量为1 0 然后存入栈中 stack[i] = a[i]; top++; if(a[i] == 'p') { stack[i] = ss[j][0]; } else if(a[i] == 'q') { stack[i] = ss[j][1]; } else if(a[i] == 'r') { stack[i] = ss[j][2]; } else if(a[i] == 's') { stack[i] = ss[j][3]; } else if(a[i] == 't') { stack[i] = ss[j][4]; } } ok = deal(top - 1, 0); if(!ok) { cout<<"not"<<endl; break; } } if(ok) { cout<<"tautology"<<endl; } getline(cin, a); } return 0; }
相关文章推荐
- 中国剩余定理的使用POJ
- poj1001 学会使用BigDecimal:)
- POJ 1565 Skew Binary pow函数使用
- poj 1149 SAP 模板使用
- poj 2891 Strange Way to Express Integers——使用中国剩余定理中处理某些方程模数不互质的方法
- POJ 3295
- poj 3372 (使用num & (num-1) 判断num是否为2的k次方)
- POJ1007 关于STL排序方法 动态数组的创建 和向量的使用
- STL map的使用 POJ2503
- POJ 3295, Tautology
- POJ 1258,并查集使用的Kruskal方法简单使用
- POJ 1547 Clay Bully 结构体数组使用题意理解
- POJ 1565 Skew Binary pow函数使用
- POJ 1258,并查集使用的Kruskal方法简单使用
- POJ 3295
- POJ3295
- 并查集的使用 POJ 1182
- POJ 3187 Backward Digit Sums next_permutation()使用
- POJ 3295 Tautology 模拟
- POJ 3295