ACM-poj-3295
解题报告:
本题是一个模拟,构造类型的题。因为只有5个操作数p,q,r,s,t,所以总共只有2的5次方32种组合,可以使用枚举的方法,尝试每个可能的取值。如果某个取值是的其计算结果不是WFF,即可输出not。剩下的就是逻辑运算了。整个输入数据的遍历可以使用栈数据结构,从输入数据的末尾向前遍历,遇到操作数就根据当前模拟值将对应的布尔值压入栈中,遇到K,A,N,C,E就取出操作数运算,将结果压入栈中。代码如下:
#include <iostream>
#include <cstdlib>
#include <cstring>
using namespace std;
bool isTaoto(char* a, int n, int value)
{
int para[5], tmp, pos = n-1;
int s[100] = {0}, top = -1;
memset(s,5, sizeof(s));
for(tmp = 0; tmp < 5; ++tmp) {
para[tmp] = value%2;
value = value/2;
}
while(pos>-1) {
switch(a[pos]) {
case 'K':
s[top-1] = s[top] && s[top-1];
top--;
break;
case 'A':
s[top-1] = s[top] || s[top-1];
top--;
break;
case 'N':
s[top] = s[top] ^ 1;
break;
case 'C':
if(s[top] == 1 && s[top-1] == 0)
s[top-1] = 0;
else
s[top-1] = 1;
top--;
break;
case 'E':
if(s[top] == s[top-1])
s[top-1] = 1;
else
s[top-1] = 0;
top--;
break;
default:
s[++top] = para[a[pos] - 112];
break;
}
pos--;
}
if(s[0])
return true;
else
return false;
}
int main()
{
char a[200];
int count;
bool ret;
cin>>a;
while(a[0] != '0') {
for(count=0; count<32; ++count) {
ret = isTaoto(a, strlen(a), count);
if(!ret) {
cout<<"not"<<endl;
break;
}
}
if(count == 32) {
cout<<"tautology"<<endl;
}
memset(a, 0, sizeof(a));
cin>>a;
}
return 0;
}