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:
The meaning of a WFF is defined as follows:
- 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.
Definitions of K, A, N, C, and E
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、K、A、N、C、E共10个字母组成的逻辑表达式,
其中p、q、r、s、t的值为1(true)或0(false),即逻辑变量;
K、A、N、C、E为逻辑运算符,
K --> and: x && y
A --> or: x || y
N --> not : !x
C --> implies : (!x)||y
E --> equals : x==y
问这个逻辑表达式是否为永真式。
PS:输入格式保证是合法的。
题意是让求如果对于五个数的所有情况一个式子总是恒为1,那么这个式子就是tautology。输出tautology。
否则输出not。
5个数,最多有2^5种情况。
判断式子是不是恒为1,只需要从后往前判断即可。
代码如下:
#include<stdio.h> #include<string.h> #include <iostream> #include<algorithm> using namespace std; char str[110]; int ans[110]; int put() { int pp,qq,ss,tt,rr,i,j; for(pp=0; pp<=1; pp++) { for(qq=0; qq<=1; qq++) { for(ss=0; ss<=1; ss++) { for(tt=0; tt<=1; tt++) { for(rr=0; rr<=1; rr++) { j=0; for(i=strlen(str)-1; i>=0; i--) { if(str[i]=='p') { ans[j]=pp; j++; } if(str[i]=='s') { ans[j]=ss; j++; } if(str[i]=='t') { ans[j]=tt; j++; } if(str[i]=='r') { ans[j]=rr; j++; } if(str[i]=='q') { ans[j]=qq; j++; } if(str[i]=='K') { j--; ans[j-1]=ans[j]&&ans[j-1]; } if(str[i]=='A') { j--; ans[j-1]=ans[j]||ans[j-1]; } if(str[i]=='C') { j--; ans[j-1]=(!ans[j-1])||ans[j]; } if(str[i]=='N') ans[j-1]=!ans[j-1]; if(str[i]=='E') { j--; ans[j-1]=ans[j]==ans[j-1]; } } if(j!=1||ans[j-1]==0) return 0; } } } } } return 1; } int main() { while(~scanf("%s",str)) { if(str[0]=='0') break; else { if(put()==1) printf("tautology\n"); else printf("not\n"); } } return 0; }
Tautology POJ - 3295
最新推荐文章于 2020-10-16 00:47:54 发布