poj 3295 Tautology

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

题意:判断一个表达式的值是否都为1,p, q, r, s, and t 为取值为true或false的元素,K, A, N, C, E则为对应的运算法则;

思路:从后往前递推,并且要尝试所有的取值可能;

代码:

View Code
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <stack>
using namespace std;
int ss[5] = {0};
int x = 0;
int y = 0;
int main()
{
char sta[110] = {NULL};
while(scanf("%s",sta),strcmp(sta,"0") != 0)
{
stack<bool>st;
int len = strlen(sta);
int temp = 1;
for(int a = 0; a < 2; ++a)
{
ss[0] = a;
for(int b = 0; b < 2; ++b)
{
ss[1] = b;
for(int c = 0; c < 2; ++c)
{
ss[2] = c;
for(int d = 0; d < 2; ++d)
{
ss[3] = d;
for(int e = 0; e < 2; ++e)
{
ss[4] = e;
while(st.empty() == false)
st.pop();
for(int i = len -1; i >= 0; --i)
{
switch(sta[i])
{
case 'p':st.push(ss[0]);break;
case 'q':st.push(ss[1]);break;
case 'r':st.push(ss[2]);break;
case 's':st.push(ss[3]);break;
case 't':st.push(ss[4]);break;
case 'K':x = st.top(),st.pop(),y = st.top(),st.pop(),st.push(x&y);break;
case 'A':x = st.top(),st.pop(),y = st.top(),st.pop(),st.push(x|y);break;
case 'N':x = st.top(),st.pop(),st.push(x^1);break;
case 'C':x = st.top(),st.pop(),y = st.top(),st.pop(),st.push((1^x)|y);break;
case 'E':x = st.top(),st.pop(),y = st.top(),st.pop(),st.push(1^(x^y));break;
default :break;
}
}
if(!st.top())
temp = 0;
}

}
}
}
}
if(temp)
printf("tautology\n");
else
printf("not\n");
}
return 0;
}



posted @ 2012-02-25 19:23  LT-blogs  阅读(180)  评论(0编辑  收藏  举报