POJ 3295 *** Tautology

题意:对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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值