题目地址
题目大意
p, q, r, _s, t是取值0或1的变量 K,A,N,C,E是操作 给出一个表达式,问这个逻辑表达式是否为永真式。
解题思路
使用stack 遍历p, q, r, _s, t 遍历整个字符串,当遇到变量 p, q, r, s ,t 则将其当前的值压栈;遇到 K,A,N,C,E进行出栈操作后入栈 最终判断是否为永真式
代码
#include <iostream>
#include <stdio.h>
#include <stack>
#include <stdlib.h>
#include <algorithm>
#define INF 0x3fffffff
#define _N 505
typedef long long LL;
using namespace std ;
int p, q, r, _s, t;
stack <int > s;
bool is_var(char c) {
switch (c) {
case 'p' : s.push(p); return true ;
case 'q' : s.push(q); return true ;
case 'r' : s.push(r); return true ;
case 's' : s.push(_s); return true ;
case 't' : s.push(t); return true ;
default : return false ;
}
}
void op(char c) {
int x, y;
switch (c) {
case 'K' : x = s.top(); s.pop(); y = s.top(); s.pop(); s.push(x&y); break ;
case 'A' : x = s.top(); s.pop(); y = s.top(); s.pop(); s.push(x|y); break ;
case 'N' : x = s.top(); s.pop(); s.push(!x); break ;
case 'C' : x = s.top(); s.pop(); y = s.top(); s.pop(); s.push((!x) || (x&y)); break ;
case 'E' : x = s.top(); s.pop(); y = s.top(); s.pop(); s.push(x==y); break ;
default : break ;
}
return ;
}
int main() {
#ifndef ONLINE_JUDGE
freopen("in.txt" , "r" , stdin);
#else
#endif
string wff;
while (cin >> wff && wff != "0" ) {
if (wff[0 ] == '0' ) break ;
while (!s.empty()) s.pop();
bool flag = true ;
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 (int i = wff.size()-1 ; i >= 0 ; i--) {
if (!is_var(wff[i])) {
op(wff[i]);
}
}
int ans = s.top();
s.pop();
if (!ans) {
flag = false ;
break ;
}
}
if (flag == false ) break ;
}
if (flag == false ) break ;
}
if (flag == false ) break ;
}
if (flag == false ) break ;
}
if (flag == false ) {
printf ("not\n" );
} else {
printf ("tautology\n" );
}
}
return 0 ;
}
参考