POJ 3295 Tautology(构造法)
Posted ventricle
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 3295 Tautology(构造法)相关的知识,希望对你有一定的参考价值。
题目网址:http://poj.org/problem?id=3295
题目:
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 13231 | Accepted: 5050 |
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的所有情况,共2^5种情况,对于每种情况都对给定的字符串进行操作,只要有一种情况是假的,结果就是假的,反之则是永真。
字符串长度不会超过100,所以最坏的情况是2^5*100 肯定不会超时。
对字符串的处理:从字符串尾部进行判断,如果是p,q,r,s,t就压入栈,如果是逻辑符号,就取栈顶元素运算。
代码:
1 #include <cstdio> 2 #include <stack> 3 #include <cstring> 4 using namespace std; 5 char str[105]; 6 int p,q,r,s,t; 7 int solve(){ 8 stack<int>num; 9 int len=strlen(str); 10 for (int i=len-1; i>=0; i--) { 11 if(str[i]>‘a‘ && str[i]<‘z‘){ 12 if(str[i]==‘p‘) num.push(p); 13 if(str[i]==‘q‘) num.push(q); 14 if(str[i]==‘r‘) num.push(r); 15 if(str[i]==‘s‘) num.push(s); 16 if(str[i]==‘t‘) num.push(t); 17 }else{ 18 int a=num.top();num.pop(); 19 if(str[i]==‘N‘) num.push(!a); 20 else{ 21 int b=num.top();num.pop(); 22 if(str[i]==‘K‘) num.push(a&b); 23 if(str[i]==‘A‘) num.push(a|b); 24 if(str[i]==‘C‘) num.push((!a)|b); 25 if(str[i]==‘E‘) num.push(a==b?1:0); 26 } 27 } 28 } 29 return num.top(); 30 } 31 int main() { 32 while (gets(str)!=NULL && str[0]!=‘0‘) { 33 int flag=0; 34 for (p=0; p<2 ; p++) { 35 for (q=0; q<2; q++) { 36 for (r=0; r<2; r++) { 37 for (s=0; s<2; s++) { 38 for (t=0; t<2; t++) { 39 if(solve()==0){ 40 flag=1; 41 break; 42 } 43 } 44 } 45 } 46 } 47 } 48 if(flag) printf("not\n"); 49 else printf("tautology\n"); 50 } 51 return 0; 52 }
以上是关于POJ 3295 Tautology(构造法)的主要内容,如果未能解决你的问题,请参考以下文章