poj 3295 Tautology

点击打开链接

Tautology
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 8127 Accepted: 3115

Description

WFF 'N PROOF is a logic game played with dice. Each die has six faces representing some subset of the possible symbols K, A, N, C, E, p, q, r, s, t. A Well-formed formula (WFF) is any string of these symbols obeying the following rules:

  • p, q, r, s, and t are WFFs
  • if w is a WFF, Nw is a WFF
  • if w and x are WFFs, Kwx, Awx, Cwx, and Ewx are WFFs.
The meaning of a WFF is defined as follows:
  • p, q, r, s, and t are logical variables that may take on the value 0 (false) or 1 (true).
  • K, A, N, C, E mean and, or, not, implies, and equals as defined in the truth table below.
Definitions of K, A, N, C, and E
     w  x  Kwx  Awx   Nw  Cwx  Ewx
  1  1  1  1   0  1  1
  1  0  0  1   0  0  0
  0  1  0  1   1  1  0
  0  0  0  0   1  1  1

tautology is a WFF that has value 1 (true) regardless of the values of its variables. For example, ApNp is a tautology because it is true regardless of the value of p. On the other hand, ApNq is not, because it has the value 0 for p=0, q=1.

You must determine whether or not a WFF is a tautology.

Input

Input consists of several test cases. Each test case is a single line containing a WFF with no more than 100 symbols. A line containing 0 follows the last case.

Output

For each test case, output a line containing tautology or not as appropriate.

Sample Input

ApNp
ApNq
0

Sample Output

tautology
not

题目大意是给你一个逻辑判断语句,让你判断是否为用真句,其中小写字母代表逻辑变量,大写字母代表的是逻辑运算符,其中逻辑运算符的运算规则已经在表里没出了,如果不是用真就输出not,如果是用真就输出tautology


解题方法也没简单,建立一个堆栈,然后就类似表达式求值了,但是这里需要说明一下运算符的表示方法

K--------- &

A--------- |

N-------- !

C(这里让我头疼了好久,数字逻辑没学好啊,没看出来什么关系,看了别人的解析才发现的,比赛中遇到只能写一个函数根据表中的关系得到逻辑关系了)----(!x)| y

E--------  ==

自己写了一个简易的栈,所以代码有点长用STL会短一些,还有就是解题时特意用了一下用一个整形表示了5个数的状态,练习一下位运算了

AC代码 0MS

#include<stdio.h>
#include<string.h>
class bool_stack
{
public:
	bool s[200];
	int top;
	bool_stack()
	{
		top = 0;
	}
	void push(bool a)
	{
		s[top++] = a;
	}
	bool pop()
	{
		top--;
		return s[top];
		
	}
};
int solve(bool * num, char * str)
{
	bool_stack stack;
	int len = strlen(str);
	int i;
	for(i = len - 1; i > -1; i--)
	{
		bool temp1, temp2;
		switch(str[i])
		{
		case 'K':
			temp1 = stack.pop();
			temp2 = stack.pop();
			stack.push(temp1 & temp2);
			break;
		case 'A':
			temp1 = stack.pop();
			temp2 = stack.pop();
			stack.push(temp1 | temp2);
			break;
		case 'N':
			temp1 = stack.pop();
			stack.push(!temp1);
			break;
		case 'C':
			temp1 = stack.pop();
			temp2 = stack.pop();
			stack.push((!temp2) | temp1);
			break;
		case 'E':
			temp1 = stack.pop();
			temp2 = stack.pop();
			stack.push(temp1 == temp2);
			break;
		default:
			stack.push(num[str[i] - 'p']);
			break;
		}
	}
	return stack.pop();
}
int main()
{
	char str[120];
	while(scanf("%s", str), str[0] != '0')
	{
		int flag = 0;
		int i;
		for(i = 0; i < 32; i++)
		{
			bool num[5];
			int j;
			for(j = 0; j < 5; j++)
			{
				num[j] = (i >> j) & 1;
			}
			if(solve(num, str) == 0)
				break;
		}
		if(i == 32)
			printf("tautology\n");
		else
			printf("not\n");
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

勇敢的炮灰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值