poj 3295 Tautology【离散数学之重言式】
2015-09-14 23:23
615 查看
[align=center]Tautology[/align]
题目大意:输入一个逻辑表达式【长度小于100】,逻辑表达式由K,A,N,C,E,p,q,r,s,t,其中
K表示合取,【Kwx即为w合取x,wx均为1时,值才为1】
A表示析取,【Awx即为w析取x,wx均为1时,值才为0】
N表示取反,【Nw即为 非w,若w=0,则Nw=1,若w=1,则Nw=0】
C表示条件,【Cwx即为非w析取x,结合A与N】
E相等, 【Ewx,w与x相等时,值为1,若不同,值为0】
【均为离散数学中的知识点】p,q,r,s,t均只有两个值,1或0;题目要求判断所输入的逻辑表达式是否为重言式【永真式】【即最后的结果全为1】
思路:
p,q,r,s,t共有32种,故定义变量 i,for i=0 to i <32;
遇到p,则 p = i & 1;
遇到q,则 q = (i >> 1) &1;
遇到r,则 r= (i >> 2) & 1;
遇到s,则s = (i >> 3) & 1;
遇到t,则 t = (i >> 4) & 1;
比如说判断函数为is_Tautology(char ,int );
遇到K 则 is_Tautology(char ,int ) & is_Tautology();
A N C E【类推 K 】
已Accept代码【c++提交】
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 10723 | Accepted: 4074 |
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 |
K表示合取,【Kwx即为w合取x,wx均为1时,值才为1】
A表示析取,【Awx即为w析取x,wx均为1时,值才为0】
N表示取反,【Nw即为 非w,若w=0,则Nw=1,若w=1,则Nw=0】
C表示条件,【Cwx即为非w析取x,结合A与N】
E相等, 【Ewx,w与x相等时,值为1,若不同,值为0】
【均为离散数学中的知识点】p,q,r,s,t均只有两个值,1或0;题目要求判断所输入的逻辑表达式是否为重言式【永真式】【即最后的结果全为1】
思路:
p,q,r,s,t共有32种,故定义变量 i,for i=0 to i <32;
遇到p,则 p = i & 1;
遇到q,则 q = (i >> 1) &1;
遇到r,则 r= (i >> 2) & 1;
遇到s,则s = (i >> 3) & 1;
遇到t,则 t = (i >> 4) & 1;
比如说判断函数为is_Tautology(char ,int );
遇到K 则 is_Tautology(char ,int ) & is_Tautology();
A N C E【类推 K 】
已Accept代码【c++提交】
#include <iostream> using namespace std; int n; char str[101]; bool step ( char str[101], int k ){ n++; switch ( str ) { case 'p': return k & 1; case 'q': return ( k >> 1 ) & 1; case 'r': return ( k >> 2 ) & 1; case 's': return ( k >> 3 ) & 1; case 't': return ( k >> 4 ) & 1; case 'N': return !step ( str, k ); case 'K': return step ( str, k ) & step ( str, k ); case 'A': return step ( str, k ) | step ( str, k ); case 'C': return !step (str, k ) | step ( str, k ); case 'E': return step ( str, k ) == step ( str, k ); } } bool judge ( char str[101] ){ for ( int i = 0; i < 32; i++ ){ n = -1; if ( !step ( str, i ) ) return false; } return true; } int main(){ while ( cin >> str && str[0] != '0' ){ if ( judge ( str ) ) cout << "tautology" << endl; else cout << "not" << endl; } return 0; }
相关文章推荐
- 用栈实现的迷宫问题
- Spring+Mybatis+mysql配置
- java常用集合类:Deque,ArrayList,HashMap,HashSet
- MyEclipse 接触 Python 编程
- 面向对象设计三大特性
- 黑马程序员----正则表达式
- 数据结构 线性结构中的数组
- nodejs安装配置
- Java设计模式之策略模式
- 不可不知的EventBus
- DOM,JAVA
- c++初步认识
- Linux与android进程间的通信及android Binder机制详解
- linq
- 遇到的面试题:html和javascript
- gcc/gdb初体验
- 正则表达式(转)
- 2.1小测验3解析-线性表的指针不能用++
- XHTML表格总结
- java单例设计模式