不得不说这道题目有点麻烦。
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<stdio.h>
#include<string.h>
using namespace std;
int stack[1000];
char str[1000];
int put()
{
int pp,qq,rr,ss,tt,n,top,i;
for(pp=0;pp<=1;pp++)
{
for(qq=0;qq<=1;qq++)
{
for(rr=0;rr<=1;rr++)
{
for(ss=0;ss<=1;ss++)
{
for(tt=0;tt<=1;tt++)
{
top=0;
n=strlen(str);
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(put()==1)printf("tautology\n");
else
printf("not\n");
}
return 0;
}