您的位置:首页 > 其它

poj 3295 Tautology

2012-06-29 16:37 351 查看
题意:

输入由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:输入格式保证是合法的

这是道题感觉是对计算器进行模拟;

解题思路:

p, q, r, s, t不同的取值组合共32种情况,枚举不同取值组合代入逻辑表达式WFF进行计算。

如果对于所有的取值组合,WFF值都为 true, 则结果为 tautology,否则为 not。

WFF的计算方法:

从字符串WFF的末尾开始依次向前读取字符。

构造一个栈stack,当遇到逻辑变量 p, q, r, s ,t 则将其当前的值压栈;

遇到 N 则取栈顶元素进行非运算,运算结果的值压栈;

遇到K, A, C, E则从栈顶中弹出两个元素进行相应的运算,将结

View Code

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<queue>
#include<set>
#include<map>
#include<vector>
using namespace std;
class Node
{
public:
int num[4];
int top;
Node( ){top = -1;};
};
int p,q,r,s,t;
void Insert( Node &Node_num ,int num )
{
Node_num.num[++Node_num.top] = num;
}
bool ischaracter( Node &Node_num,char c )
{
switch( c )
{
case 'p':Insert( Node_num ,p );return true;
case 'q':Insert( Node_num ,q );return true;
case 'r':Insert( Node_num ,r );return true;
case 's':Insert( Node_num ,s );return true;
case 't':Insert( Node_num ,t );return true;
}
return false;
}
int Pop( Node &Node_num )
{
return Node_num.num[Node_num.top--];
}
int Opt_K( int x, int y )
{
return x&&y;
}
int Opt_N( int x )
{
return !x;
}
int Opt_C( int x, int y )
{
return (!x)||y;
}
int Opt_A( int x, int y )
{
return x||y;
}
int Opt_E(int x, int y)
{
if( x==y ) return 1;
else return 0;
}
void Opt( Node &Node_num , char c )
{
switch( c )
{
case 'K':Insert( Node_num ,Opt_K( Pop( Node_num ) ,Pop( Node_num )) );return;
case 'N':Insert( Node_num ,Opt_N( Pop( Node_num ) ) );return;
case 'C':Insert( Node_num ,Opt_C( Pop( Node_num ) ,Pop( Node_num )) );return;
case 'A':Insert( Node_num ,Opt_A( Pop( Node_num ) ,Pop( Node_num )) );return;
case 'E':Insert( Node_num ,Opt_E( Pop( Node_num ) ,Pop( Node_num )) );return;
}
}
int main(  )
{
char num[324];
while( scanf( "%s",num ) ,num[0]!='0' )
{
Node Node_num,Node_opt;
int flag = 1;
int len = strlen( num );
for(  p = 0 ; p <2&&flag  ; p ++ )
{
for(  q = 0 ; q < 2&&flag  ; q ++ )
{
for(  r = 0 ; r < 2&&flag  ; r ++ )
{
for(  s = 0 ; s < 2&&flag  ; s ++ )
{
for(  t = 0 ; t < 2&&flag ; t ++ )
{
for( int i = len -1 ; i >=0 ; i -- )
{
if( !ischaracter( Node_num , num[i] ) )
Opt( Node_num , num[i] );
}
flag = Node_num.num[0];
}
}
}
}
}
if( flag ) printf( "tautology\n" );
else printf( "not\n" );
}
//system( "pause" );
return 0;
}


果的值压栈。

由于输入是合法的,当字符串WFF扫描结束时,栈stack中只剩一个值,该值就是逻辑表达式WFF的值。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: