题目大意:就是确定永真式p,q,r,s,t为逻辑变量,K,A,N,C,E为逻辑操作符,就是考虑逻辑变量所有情况,所有变量和操作符压入栈中,然后取出变量做逻辑运算,将结果再压回栈中,看最后结果是不是为真。 #include <iostream> #include <stack> #include <cstdio> #include <cstring> using namespace std; int pp, qq, rr, ss, tt; stack<int> s; bool isVar(char ch) { switch(ch) { case 'p':s.push(pp);return true; case 'q':s.push(qq);return true; case 'r':s.push(rr);return true; case 's':s.push(ss);return true; case 't':s.push(tt);return true; } return false; } void oper(char op) { switch(op) { case 'K': { int a = s.top(); s.pop(); int b = s.top(); s.pop(); s.push(a&&b); break; } case 'A': { int a = s.top(); s.pop(); int b = s.top(); s.pop(); s.push(a||b); break; } case 'N': { int a = s.top(); s.pop(); s.push(!a); break; } case 'C': { int a = s.top(); s.pop(); int b = s.top(); s.pop(); s.push((!a)||b); break; } case 'E': { int a = s.top(); s.pop(); int b = s.top(); s.pop(); s.push(a==b); break; } } } int main() { //freopen("temp.txt", "r", stdin); char WFF[101]; while (cin >> WFF && WFF[0] != '0') { int len = strlen(WFF); bool flag = true; 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) { for (int i = len-1; i >= 0; --i) { if (!isVar(WFF[i])) oper(WFF[i]); } if (s.top() == 0) { flag = false; break; } } if (!flag) break; } if (!flag) break; } if (!flag) break; } if (!flag) break; } if (flag) cout << "tautology" << endl; else cout << "not" << endl; } return 0; }