poj 3295 Tautology
2016-07-26 11:41
351 查看
Tautology
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.
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 |
提示
题意:有符号K, A, N, C, E, p, q, r, s, t,逻辑命题(WFF)中的符号遵循一下规则:
1.K, A, N, C, E为逻辑运算符,p, q, r, s, t为二进制数(也就是0与1)。
2.逻辑运算符与值作为逻辑命题。(实际上也就是if和else里的判断条件了)
给你一个命题(逻辑表达式)看它是否为恒真命题(真)。
思路:
枚举,但还是去找了下度娘,看着简单做着难。(⊙.⊙)
示例程序
Source Code Problem: 3295 Code Length: 2860B Memory: 392K Time: 0MS Language: GCC Result: Accepted #include <stdio.h> #include <string.h> int f(char ch[]) { int a[100],top,p,q,r,s,t,i; //借助栈存储数据 for(p=0;p<=1;p++) //暴力枚举 { for(q=0;q<=1;q++) { for(r=0;r<=1;r++) { for(s=0;s<=1;s++) { for(t=0;t<=1;t++) { top=0; for(i=strlen(ch)-1;i>=0;i--) { if(ch[i]=='p') { a[top]=p; top++; } else if(ch[i]=='q') { a[top]=q; top++; } else if(ch[i]=='r') { a[top]=r; top++; } else if(ch[i]=='s') { a[top]=s; top++; } else if(ch[i]=='t') { a[top]=t; top++; } else if(ch[i]=='K') { top--; a[top-1]=a[top-1]&&a[top]; } else if(ch[i]=='A') { top--; a[top-1]=a[top-1]||a[top]; } else if(ch[i]=='N') { a[top-1]=!a[top-1]; } else if(ch[i]=='C') { top--; a[top-1]=(!a[top-1])||a[top]; } else if(ch[i]=='E') { top--; a[top-1]=a[top-1]==a[top]; } } if(top!=1||a[top-1]==0) //top不为1说明表达式不合法,后面的则是一有为0的情况就跳出 { return 0; } } } } } } return 1; } int main() { char ch[101]; scanf("%s",ch); while(ch[0]!='0') { if(f(ch)==1) { printf("tautology\n"); } else { printf("not\n"); } scanf("%s",ch); } return 0; }
相关文章推荐
- findbugs常见问题
- 2016.07.21【初中部 NOIP提高组 】模拟赛C
- 一个简单的锁的实现
- [LeetCode练习题-C语言]242. Valid Anagram
- javascript比较实用方法:身份证验证、文本框设置不可空等等
- 中国互联网技术联盟发布首个“互联网+”权威定义
- Python(1):入门
- Qt多线程间信号槽传递非QObject类型对象的参数
- js注意事项07
- Java集合类之HashMap原理小结
- HDOJ - 2199 Can you solve this equation?
- iOS-调整UIButton的title和image的位置
- Android studio改改编码格式
- 【数据结构】单链表—链表中倒数第K个结点 — 快慢指针
- static 类深入了解
- iOS开发多线程atomic nonatomic区别
- js 常用函数
- Java数组初始化
- Android自定义相机定点聚焦
- 自我营销与自我救赎