您的位置:首页 > 其它

poj 3295 Tautology【离散数学之重言式】

2015-09-14 23:23 615 查看
[align=center]Tautology[/align]

Time Limit: 1000MSMemory Limit: 65536K
Total Submissions: 10723Accepted: 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
题目大意:输入一个逻辑表达式【长度小于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++提交】
#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: