POJ 3295.Tautology

题目链接:http://poj.org/problem?id=3295

题目大意:一个逻辑表达式,最多有五个输入人,p,q,r,s,t。有五种操作,判断是不是对于任意输入输出都为1.

解题思路:应为输入只有5个,且输入只能为0,1。所以最多就只有32种情况,有表达式最多100个字符也不多。直接暴力求解即可。用堆栈求解表达式,从表达式从最后开始,如果是p,q,r,s,t压入堆栈,如果是K、A、N、C、E则从堆栈取出操作符需要的数字(除N取1个以外,其它均取2个),进行计算并将结果压入堆栈。

操作符解释:

K --> and:  x && y

A --> or:  x || y

N --> not :  !x

C --> implies :  (!x)||y

E --> equals :  x==y

#include <cstdio>
#include <cstring>
#include <cassert>
#include <stack>

char data[105];
int  x[5];
int  len;

using namespace std;


void assign(int n)
{
	for (int i = 0; i < 5; ++i)
		x[i] = (n >> i) & 1;
}

int getInt(int pos)
{
	assert (data[pos]>='p' && data[pos] <='t');
	return x[data[pos]-'p'];
}


int caculate ()
{
	stack<int> s;

	int a, b;
	for (int i = len - 1; i >= 0; --i)
	{
		if (data[i] >= 'p' && data[i] <= 't')
		{
			s.push(getInt(i));
			continue;
		}
		switch (data[i])
		{
		case 'N':
			a = s.top();s.pop();s.push(1-a);break;
		case 'K':
			a = s.top();s.pop();b = s.top();s.pop();s.push(a&b);break;
		case 'A':
			a = s.top();s.pop();b = s.top();s.pop();s.push(a|b);break;
		case 'C':
			a = s.top();s.pop();b = s.top();s.pop();s.push((!a)|b);break;
		case 'E':
			a = s.top();s.pop();b = s.top();s.pop();s.push(a==b);break;
		}
	}
	return s.top();
}

int main ()
{
	while (scanf ("%s", data))
	{
		if (data[0] == '0')
			break;

		len = strlen(data);

		int i;
		for (i = 0; i < 32; ++i)
		{
			assign(i);
			if(caculate () == 0)
				break;	
		}

		if (i == 32)
			printf ("tautology\n");
		else
			printf ("not\n");
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值