您的位置:首页 > 其它

poj 3295 Tautology (构造)

2013-07-30 15:36 288 查看
题目:http://poj.org/problem?id=3295

题意:p,q,r,s,t,是五个二进制数。

K,A,N,C,E,是五个运算符。

K:&&

A:||
N:!

C:(!w)||x

E:w==x

题意是让求如果对于五个数的所有情况一个式子总是恒为1,那么这个式子就是tautology。输出tautology。

否则输出not。

5个数,最多有2^5种情况。

判断式子是不是恒为1,只需要从后往前判断即可。

这题好长时间没看懂,代码也是看网上大神的

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
char str[110];
int stack[110];

int check()
{
int pp,qq,rr,ss,tt,n,i,top;
n=strlen(str);
for(pp = 0; pp < 2; pp++)
for(qq = 0; qq < 2; qq++)
for(rr = 0; rr < 2; rr++)
for(ss = 0; ss < 2; ss++)
for(tt = 0; tt < 2; tt++)
{
top = 0;
for(i = n-1; i >= 0; i--)
{
if(str[i]=='q') stack[top++]=qq;
if(str[i]=='p') stack[top++]=pp;
if(str[i]=='r') stack[top++]=rr;
if(str[i]=='t') stack[top++]=tt;
if(str[i]=='s') stack[top++]=ss;
if(str[i]=='K') top--,stack[top-1]=(stack[top-1]&&stack[top]);
if(str[i]=='A') top--,stack[top-1]=(stack[top-1]||stack[top]);
if(str[i]=='N') stack[top-1]=!stack[top-1];
if(str[i]=='C') top--,stack[top-1]=((!stack[top-1])||stack[top]);
if(str[i]=='E') top--,stack[top-1]=((stack[top-1])==stack[top]);
}
if(top!=1||stack[top-1]!=1)
return 0;
}

return 1;
};

int main()
{
while(gets(str)&&str[0]!='0')
{
if(check())
cout<<"tautology"<<endl;
else
cout<<"not"<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: