这是我第一个一次就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;
}
}