您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: