POJ3295 Tautology (模拟)

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

题目大意:给定一个字符串,有特定的字符作为逻辑运算符,求给定字符串最后的计算结果。

思路:给定一个逻辑运算,逻辑运算符肯定在运算数的前面,所以最好的方法是从后往前运算。首先,在计算的时候,应该把每个字符用0 or 1随机表示出来,最多有5种运算数字符,所以把32转化成二进制数进行运算即可。用二进制数来表示随机运算数。另外,可能会出现KKwxw这类的情况,所以应该用栈把运算数存储起来,当遇到运算符时,取栈顶两个元素即可。

AC代码如下:

#include <cstdio>
#include <stack> 
#include <cstring>
using namespace std;

char str[105];
int vis[205],flag,f[40][10];

void Init(int len){
	for(int i = 0; i < 32; i ++){
		int k = i;
		for(int j = 4; j >= 0; j --){
			f[i][j] = k % 2;
			k /= 2;
		}
	}
}

void slove(){
	int x,y,b;
	for(int j = 0; j < 32; j ++){
		stack<int> p;
		for(int i = strlen(str) - 1; i >= 0; i --){
			if(str[i] <= 'z' && str[i] >= 'a'){
				b = f[j][str[i]-'p'];
				p.push(b);
			}
			else{
				if(str[i] == 'N'){
					x = p.top();	p.pop();
					x = !x;
				}
				else{
					x = p.top();	p.pop();
					y = p.top();	p.pop();
					if(str[i] == 'K'){
						x = x & y;
					}
					else if(str[i] == 'A'){
						x = x | y;
					}
					else if(str[i] == 'C'){
						if(x && !y)
							x = 0;
						else
							x = 1;
					}
					else{
						if(x == y)
							x = 1;
						else
							x = 0;
					}
				}
				p.push(x);
			}
		}
		if(!p.top()){
			flag = 0;
			break;
		}
	}
}
/*
void display(){
	for(int i = 0; i < 32; i ++){
		for(int j = 0; j < 5; j ++){
			printf("%d  ",f[i][j]);
		}
		printf("\n");
	}
}
*/
int main(){
	Init(0);
//	display();
	while(~scanf("%s",str)){
		if(str[0] == '0')
			break;
		int a[205];
		memset(vis,0,sizeof(vis));
		flag = 1;
	
		slove();
		
		if(flag)
			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、付费专栏及课程。

余额充值