poj3295

这是我第一个一次就ac的题目,值得纪念一下。

总体的来说这个题目也并没有什么难度,只要明白运算的规则是从后面开始进行的就基本解决问题了。

中间要注意字符1和数字1的互相转换。

#include <stack>
#include <iostream>
#include <string>
using namespace std;
int p=0,q=0,r=0,s=0,t=0,flag;
int isVariable(char c)
{
	return c=='p'||c=='q'||c=='r'||c=='s'||c=='t'?1:0;
}
int isOperation(char c)
{
	return c=='K'||c=='A'||c=='C'||c=='E'||c=='N'?1:0;
}
int solve(char operation,int a,int b)
{
	switch (operation)
	{
	case 'K':
		return a&&b;
	case 'A':
		return a||b;
	case 'C':
		if(a==1&&b==0)
		return 0;
		else return 1;
	case 'E':
		return a==b?1:0;
	case 'N':
		return !a;
	}
}
int convert(char c)
{
	int a;
	a=c-'p';
	switch (a)
	{
	case 0:return p;
	case 1:return q;
	case 2:return r;
	case 3:return s;
	case 4:return t;
	default:return c-'0';
	}

}
int main()
{
	string sentence;
	char operation;
	int a,b,current;
	stack<char> formula;
	cin >> sentence;
	while (sentence!="0")
	{
		flag=0;
		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 (string::iterator it=sentence.end()-1;it>=sentence.begin();--it)
							{
								if (isVariable(*it))
									formula.push(*it);
								if(isOperation(*it))
								{
									if(*it=='N'){
										a=convert(formula.top());
										formula.pop();
										current=solve('N',a,NULL);
										formula.push(current+'0');
									}
									else{
										a=convert(formula.top());
										formula.pop();
										b=convert(formula.top());
										formula.pop();
										current=solve(*it,a,b);
										formula.push(current+'0');
									}
								}
							}
							if(formula.top()=='1')
								flag=1;
							else flag=0;
							if(!flag)	break;
						}
						if(!flag)	break;
					}
					if(!flag)	break;
				}
				if(!flag)	break;
			}
			if(!flag)	break;
		}	
		if(flag)
			cout << "tautology" << endl;
		else
				cout << "not" << endl;
		cin >> sentence;
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值