Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 10096 | Accepted: 3847 |
Description
WFF ‘N PROOF is a logic game played with dice. Each die has six faces representing some subset of the possible symbols K, A, N, C, E, p, q, r, s, t. A Well-formed formula (WFF) is any string of these symbols obeying the following rules:
|
w x | Kwx | Awx | Nw | Cwx | Ewx |
1 1 | 1 | 1 | 0 | 1 | 1 |
1 0 | 0 | 1 | 0 | 0 | 0 |
0 1 | 0 | 1 | 1 | 1 | 0 |
0 0 | 0 | 0 | 1 | 1 | 1 |
A tautology is a WFF that has value 1 (true) regardless of the values of its variables. For example, ApNp is a tautology because it is true regardless of the value of p. On the other hand, ApNq is not, because it has the value 0 for p=0, q=1.
You must determine whether or not a WFF is a tautology.
Input
Input consists of several test cases. Each test case is a single line containing a WFF with no more than 100 symbols. A line containing 0 follows the last case.
Output
For each test case, output a line containing tautology or not as appropriate.
Sample Input
ApNp
ApNq
0
Sample Output
tautology
not
Source
#include <cstdio> #include <stack> #include <cstring> using namespace std; int const MAX = 150; stack <int> st; char s[MAX]; void cal(int p, int q, int r, int s1, int t) { int len = strlen(s); for(int i = len - 1; i >= 0; i --) { if(s[i] == 'p') st.push(p); else if(s[i] == 'q') st.push(q); else if(s[i] == 'r') st.push(r); else if(s[i] == 's') st.push(s1); else if(s[i] == 't') st.push(t); else if(s[i] == 'K') { int t1 = st.top(); st.pop(); int t2 = st.top(); st.pop(); st.push(t1 && t2); } else if(s[i] == 'A') { int t1 = st.top(); st.pop(); int t2 = st.top(); st.pop(); st.push(t1 || t2); } else if(s[i] == 'N') { int t1 = st.top(); st.pop(); st.push(!t1); } else if(s[i] == 'C') { int t1 = st.top(); st.pop(); int t2 = st.top(); st.pop(); if(t1 == 1 && t2 == 0) st.push(0); else st.push(1); } else if(s[i] == 'E') { int t1 = st.top(); st.pop(); int t2 = st.top(); st.pop(); if((t1 == 1 && t2 == 1) || (t1 == 0 && t2 == 0)) st.push(1); else st.push(0); } } } bool judge() { for(int p = 0; p < 2; p++) for(int q = 0; q < 2; q++) for(int r = 0; r < 2; r++) for(int s1 = 0; s1 < 2; s1++) for(int t = 0; t < 2; t++) { cal(p, q, r, s1, t); if(st.top() == 0) return false; } return true; } int main() { while(scanf("%s", s) != EOF && !(strlen(s) == 1 && s[0] == '0')) { if(judge()) printf("tautology\n"); else printf("not\n"); } }
原文地址:http://blog.csdn.net/tc_to_top/article/details/44517079