Tautology
| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 10073 | Accepted: 3832 |
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
题目大意:
p,q,r,s,t可以取0或1,K,A,N,C,E代表某种运算符,具体题目有说明,输入给出表达式,如果这个表达式的计算结果是永真(恒为1),那么输出tautology,否则输出not.
解题思路:
永真式的定义是表达式值恒为1,所以我们只需枚举每一种情况如果都为1,那么就是永真式,否则就不是永真式。具体有两种做法,一种是利用递归,另一种则是用栈,本题个人采用的是栈来存储数据。可以把数值从右到左插入栈中,那么根据栈的优先顺序我们可以直到,先入后出,所以等价于取出值是从左往右取,满足运算顺序。
代码如下:
#include<iostream>
#include<stack>
#include<cstring>
#include<cstdio>
#include<string>
using namespace std;
stack<int> stk; //数据栈
bool judge(char ch,int pp,int qq,int rr,int ss,int tt) //判断是运算符还是数值,如果是数值就将其压入数值栈
{
switch(ch)
{
case 'p':
stk.push(pp);
return true;
case 'q':
stk.push(qq);
return true;
case 'r':
stk.push(rr);
return true;
case 's':
stk.push(ss);
return true;
case 't':
stk.push(tt);
return true;
}
return false;
}
void operator1(char ch) //操作符
{
switch(ch)
{
case 'K':
{
int x = stk.top();
stk.pop();
int y = stk.top();
stk.pop();
stk.push(x && y);
break;
}
case 'A':
{
int x = stk.top();
stk.pop();
int y = stk.top();
stk.pop();
stk.push(x || y);
break;
}
case 'N':
{
int x = stk.top();
stk.pop();
stk.push(!x);
break;
}
case 'C':
{
int x = stk.top();
stk.pop();
int y = stk.top();
stk.pop();
stk.push((!x) || y);
break;
}
case 'E':
{
int x = stk.top();
stk.pop();
int y = stk.top();
stk.pop();
stk.push(x == y);
break;
}
}
}
int main()
{
int flag;
int p,q,r,s,t,i;
string c;
//freopen("111","r",stdin);
while(cin>>c && c[0] != '0')
{
flag = 1;
for(p=0; p<=1; p++) //枚举 2^5种情况,如果都为真才是永真式
{
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(i=c.size()-1; i>=0; i--) //从右往左
{
if(!judge(c[i],p,q,r,s,t)) //如果是运算符
{
operator1(c[i]);
}
}
int res = stk.top();
stk.pop();
if(res == 0)
{
flag = 0;
break;
}
}
if(flag == 0)
break;
}
if(flag == 0)
break;
}
if(flag == 0)
break;
}
if(flag == 0)
break;
}
if(flag != 0)
{
cout<<"tautology"<<endl;
}
else if(flag == 0)
{
cout<<"not"<<endl;
}
while(!stk.empty())
{
stk.pop();
}
}
return 0;
}
运行结果:

253

被折叠的 条评论
为什么被折叠?



