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:
- p, q, r, s, and t are WFFs
- if w is a WFF, Nw is a WFF
- if w and x are WFFs, Kwx, Awx, Cwx, and Ewx are WFFs.
- p, q, r, s, and t are logical variables that may take on the value 0 (false) or 1 (true).
- K, A, N, C, E mean and, or, not, implies, and equals as defined in the truth table below.
|
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
Waterloo Local Contest, 2006.9.30
題目大意:給你一個字符串,依據題目給出來的邏輯判斷,讓你判斷對於5種小寫字母(可以取0,1),是不是都滿足字符串爲1。
分析:直接掃一遍字符串就行,if情況比較多,得有耐心。
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
using namespace std;
const int n = 1<<5;
string ss;
int len;
int cur;
int wf[5];
bool solve()
{
int w, x;
if(cur == len) return 1;
char ch = ss[cur++];
if(ch == 'K') {
w = solve();
x = solve();
return (w && x);
}
else if(ch == 'A') {
w = solve();
x = solve();
return (w || x);
}
else if(ch == 'N') {
w = solve();
return (!w);
}
else if(ch == 'C') {
w = solve();
x = solve();
return (!(w && !x));
}
else if(ch == 'E') {
w = solve();
x = solve();
return (w == x);
}
else if(ch == 'p') return wf[0];
else if(ch == 'q') return wf[1];
else if(ch == 'r') return wf[2];
else if(ch == 's') return wf[3];
else if(ch == 't') return wf[4];
}
int main()
{
while(cin >> ss) {
if(ss[0] == '0') break;
len = ss.length();
int ok = 1;
for(int i = 0; i < n; ++i) {
int tag = i;
for(int j = 0; j < 5; ++j) {
wf[j] = tag % 2;
tag /= 2;
}
cur = 0;
if(!solve()) ok = 0;
}
if(ok) printf("tautology\n");
else printf("not\n");
}
return 0;
}