题目链接:
https://vjudge.net/problem/POJ-3295
题目大意:
输入由p、q、r、s、t、K、A、N、C、E共10个字母组成的逻辑表达式WFF
其中
p、q、r、s、t的值为1(true)或0(false),即逻辑变量.
K、A、N、C、E为逻辑运算符,含义如下:
问WFF是否为【永真式】 (大前提:【输入格式保证是合法的】)
思路:
可以把上述打表,然后求表达式的时候用栈,从后往前来模拟。之后在网上看到各个大写字母转化成具体表达式:
K --> and: w && x
A --> or: w || x
N --> not : !w
C --> implies : (!w) || x
E --> equals : w == x
总共5个小写字母,直接枚举,然后每个表达式进行判断即可
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<map>
#include<queue>
#include<stack>
using namespace std;
typedef long long ll;
bool a[];
map<char, int>Map;
bool vis[][][];
void init()
{
Map['K'] = ;
Map['A'] = ;
Map['C'] = ;
Map['E'] = ;
//K w x
vis[][][] = ;
vis[][][] = ;
vis[][][] = ;
vis[][][] = ;
//A w x
vis[][][] = ;
vis[][][] = ;
vis[][][] = ;
vis[][][] = ;
//C w x
vis[][][] = ;
vis[][][] = ;
vis[][][] = ;
vis[][][] = ;
//E w x
vis[][][] = ;
vis[][][] = ;
vis[][][] = ;
vis[][][] = ;
}
string s;
bool solve()
{
stack<bool>q;
for(int i = s.size() - ; i >= ; i--)
{
if(islower(s[i]))q.push(a[s[i] - 'p']);
else
{
if(s[i] == 'N')
{
bool w = q.top();
q.pop();
w = !w;
q.push(w);
}
else
{
bool w = q.top();
q.pop();
bool x = q.top();
q.pop();
q.push(vis[Map[s[i]]][w][x]);
}
}
}
return q.top();
}
int main()
{ init();
while(cin >> s)
{
if(s.size() == && s[] == '')break;
bool ok = ;
for(int i = ; i < (<<); i++)
{
for(int j = ; j < ; j++)
{
if(i & ( << j))a[j] = ;
else a[j] = ;
}
if(!solve()){ok = ;break;}
}
if(ok)cout<<"tautology"<<endl;
else cout<<"not"<<endl;
}
return ;
}