poj3295 栈+递归的使用

来源:互联网 发布:算法第四版epub下载 编辑:程序博客网 时间:2024/06/07 04:11
//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';elsereturn '1';}char and2(char c, char c2){if(c=='1' && c2=='1')return '1';elsereturn '0';}char or2(char c, char c2){if(c == '0' && c2 == '0')return '0';elsereturn '1';}char implies2(char c, char c2){if(c == '1' && c2 == '0')return '0';elsereturn '1';}char equals2(char c, char c2){if(c != c2)return '0';elsereturn '1';}bool deal(int i, int j){if(i == j){if(stack[i] == '1')return true;elsereturn 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;}

0 0