poj_3295

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

题中所给的p,q,r,s,t是bool值,可取0或者1。

还有五中运算符:K,A,N,C,E:分别是 

Kab---->a&&b

Aab---->a||b

Na----->!a

Cab---->(!a)||b

Eab----->a==b

给你一个这种带运算符和bool值得式子,判断是否这个式子是永远为真的,是的话输出tautology,否则输出not。

首先为了判断某个式子是否为真,那么我们就得讲p,q,r,s,t这五个变量所有的取值都试一遍,如果全部取值使得最终结果都为真,那么说明该式子是为真的。

其实这题跟那个用栈来实现带优先级的运算是很像的,每次我们先从最后一个变量开始取值并运算,得出的结果再放入栈中,直到最后栈中只含有一个元素,那就是最终的结果,一旦发现某个值不为真,那么说明这个式子不是永真的,跳出判断即可。

#include<stdio.h>
#include<iostream>
#include<string>
#include<string.h>
#include<algorithm>
#include<iomanip>
#include<vector>
#include<time.h>
#include<queue>
#include<stack>
#include<iterator>
#include<math.h>
#include<stdlib.h>
#include<limits.h>
#include<set>
#include<map>
//#define ONLINE_JUDGE
#define eps 1e-8
#define INF 0x7fffffff
#define FOR(i,a) for((i)=0;i<(a);(i)++)
#define MEM(a) (memset((a),0,sizeof(a)))
#define sfs(a) scanf("%s",a)
#define sf(a) scanf("%d",&a)
#define sfI(a) scanf("%I64d",&a)
#define pf(a) printf("%d\n",a)
#define pfI(a) printf("%I64d\n",a)
#define pfs(a) printf("%s\n",a)
#define sfd(a,b) scanf("%d%d",&a,&b)
#define sft(a,b,c)scanf("%d%d%d",&a,&b,&c)
#define for1(i,a,b) for(int i=(a);i<b;i++)
#define for2(i,a,b) for(int i=(a);i<=b;i++)
#define for3(i,a,b)for(int i=(b);i>=a;i--)
#define MEM1(a) memset(a,0,sizeof(a))
#define MEM2(a) memset(a,-1,sizeof(a))
const double PI=acos(-1.0);
template<class T> T gcd(T a,T b){return b?gcd(b,a%b):a;}
template<class T> T lcm(T a,T b){return a/gcd(a,b)*b;}
template<class T> inline T Min(T a,T b){return a<b?a:b;}
template<class T> inline T Max(T a,T b){return a>b?a:b;}
using namespace std;
#define ll __int64
int n,m;
int p,q,r,s,t;
char ch[110];
stack<int>sk;
bool isVar(char c){		//取值入栈
	if(c == 'p'){
		sk.push(p);
		return true;
	}else if(c=='q'){
		sk.push(q);
		return true;
	}else if(c=='r'){
		sk.push(r);
		return true;
	}else if(c=='s'){
		sk.push(s);
		return true;
	}else if(c=='t'){
		sk.push(t);
		return true;
	}
	return false;
}
void opera(char c){		//运算
	int val1,val2;
	int res;
	if(c=='K'){
		val1 = sk.top();
		sk.pop();
		val2 = sk.top();
		sk.pop();
		res = (val1&&val2);
		sk.push(res);
	}else if(c == 'A'){
		val1 = sk.top();
		sk.pop();
		val2 = sk.top();
		sk.pop();
		res = (val1 || val2);
		sk.push(res);
	}else if(c == 'N'){
		val1 = sk.top();
		sk.pop();
		res = (!val1);
		sk.push(res);
	}else if(c == 'C'){
		val1 = sk.top();
		sk.pop();
		val2 = sk.top();
		sk.pop();
		res = ((!val1)||val2);
		sk.push(res);
	}else if(c == 'E'){
		val1 = sk.top();
		sk.pop();
		val2 = sk.top();
		sk.pop();
		res = (val1==val2);
		sk.push(res);
	}
}
int main(){
//	freopen("in.txt","r",stdin);
	while(sfs(ch)!=EOF){
		while(!sk.empty())
			sk.pop();
		if(ch[0]=='0') break;
		int len = strlen(ch);
		int  flag=1,ans;
		for(p=0;p<=1;p++){
			for(q=0;q<=1;q++){
				for(r=0;r<=1;r++){
					for(s=0;s<=1;s++){
						for(t=0;t<=1;t++){
								for(int i=len-1;i>=0;i--){
									if(!isVar(ch[i]))
										 opera(ch[i]);
								}
								ans = sk.top();		//最后的结果
								sk.pop();
								if(!ans){		//不为真
									flag=0;
									break;
								}
						}
						if(!flag) break;
					}
					if(!flag) break;
				}
				if(!flag) break;
			}
			if(!flag) break;
		}
		if(flag)
			printf("tautology\n");
		else
			printf("not\n");
	}
return 0;
}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值