您的位置:首页 > 其它

POJ 3295 *** Tautology

2015-11-15 12:40 344 查看
题意:对p q r s t这五个逻辑变量有与K 或A 非N 蕴涵C 同或E的基本操作。给出一串由p q r s t K A N C E组成的表达式,求该表达式是否为永真式。

要求:表达式长度不超过100个字符。

想法:数据类型肯定是用栈,但是我一直在想栈的元素该用什么才能把p q r s t的32个状态统统表示出来,中间用了一次stack<int[32]>这种,但是编译都没通过,于是放弃。
后来看了一下别人的解答,才发现可以枚举p q r s t的值。对每次 p q r s t 的值对表达式求一次值,然后查看表达式的值是否一直为true。

代码如下:
#pragma warning(disable:4996)
#include<iostream>
#include<cstdio>
#include<cmath>
#include<stack>
#include<cstring>
#include<sstream>
#include<set>
#include<string>
#include<iterator>
#include<vector>
#include<map>
#include<algorithm>
using namespace std;

int var[110];
int main() {
//freopen("input.txt", "r", stdin);
//freopen("output.txt","w",stdout);
string str;
while (cin >> str, str[0] != '0') {
int size = str.size();
int p, q, r, s, t, flag = 1,top;
for (p = 0; p < 2; ++p)
if (flag)for (q = 0; q < 2; ++q)
if (flag)for (r = 0; r < 2; ++r)
if (flag)for (s = 0; s < 2; ++s)
if (flag)for (t = 0; t < 2; ++t) {
memset(var, 0, sizeof(var));
top = 0;
int a, b;
for (int i = size - 1; i >= 0; --i)
switch (str[i]) {
case'p':var[top++] = p; break;
case'q':var[top++] = q; break;
case'r':var[top++] = r; break;
case's':var[top++] = s; break;
case't':var[top++] = t; break;
case'K':a = var[--top]; b = var[--top];
var[top++] = a&b; break;
case'A':a = var[--top]; b = var[--top];
var[top++] = a | b; break;
case'N':a = var[--top];
var[top++] = 1 - a; break;
case'C':a = var[--top]; b = var[--top];
var[top++] = !a | b; break;
case'E':a = var[--top]; b = var[--top];
var[top++] = !(a^b);
}
if (!var[--top])flag = 0;
}
if (flag)cout << "tautology" << endl;
else cout << "not" << endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: