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.
The meaning of a WFF is defined as follows:
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 | 0 | 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
题意
有K , C , A, E, N 五种运算符, p,q,r,s,t五种运算数,运算得到重言式输出tautology, 不是重言式输出not,
重言式是指永真式,即无论输入什么,结果都为1.
思路
运算数p , q , r, s, t都只有0,1两种输入,枚举所有情况即可。
map映射
只有32种情况,int型变量的二进制数就可以代表所以情况(状态压缩)
K 相当于 p && q
A 相当于 p || q
N 相当于 !p
C 相当于 p→q
E 相当于 p↔q
代码
#include <cstdio>
#include <iostream>
#include <stack>
#include <map>
#include <cstring>
using namespace std;
char str[110];
stack<int > s;
map<char, int> mp;
int wwf;
int len, n;
int tmp1 , tmp2;
void getbit(int i)
{
mp['s'] = (i >> 0) & 1;
mp['p'] = (i >> 1) & 1;
mp['q'] = (i >> 2) & 1;
mp['r'] = (i >> 3) & 1;
mp['t'] = (i >> 4) & 1;
}
bool gao()
{
for(int i = 0; i < 32; i ++)
{
getbit(i);
for(int j = len-1; j >= 0; j --)
{
switch(str[j])
{
case 'K':
tmp1 = s.top(); s.pop();
tmp2 = s.top(); s.pop();
s.push(tmp1 && tmp2); //与
break;
case 'A':
tmp1 = s.top(); s.pop();
tmp2 = s.top(); s.pop();
s.push(tmp1 || tmp2);//或
break;
case 'C':
tmp1 = s.top(); s.pop();
tmp2 = s.top(); s.pop();
s.push(!tmp1 || tmp2);//→
break;
case 'N':
tmp1 = s.top(); s.pop();
s.push(!tmp1);//非
break;
case 'E':
tmp1 = s.top(); s.pop();
tmp2 = s.top(); s.pop();
s.push((!tmp1 || tmp2)&&(tmp1 || !tmp2));//↔
break;
default :
s.push(mp[str[j]]);
}
}
if(s.top() == 0)
return false;
}
return true;
}
int main()
{
while(cin >> str && str[0] != '0')
{
len = strlen(str);
if(gao())
cout << "tautology" << endl;
else
cout << "not" << endl;
}
}
位运算大法好