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
果的值压栈。
由于输入是合法的,当字符串WFF扫描结束时,栈stack中只剩一个值,该值就是逻辑表达式WFF的值。
输入由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的值。
相关文章推荐
- POJ 3295:Tautology
- POJ 3295 Tautology(构造法)
- POJ 3295 Tautology解题报告
- POJ 3295:Tautology
- poj 3295--Tautology
- poj 3295 Tautology【构造法】【刷题计划】
- POJ-3295-Tautology-2013-12-04 20:44:18
- POJ 3295 Tautology (构造题)
- POJ 3295 Tautology
- POJ 3295 Tautology(构造法)
- POJ 3295-Tautology(构造法+栈)
- poj_3295 Tautology(构造+枚举)
- poj-3295-Tautology
- POJ 3295-Tautology(模拟-逻辑表达式)
- POJ-3295-Tautology
- 初级->基本算法->构造法 poj 3295 Tautology(永真式)
- POJ 3295 Tautology(递归、构造)
- POJ 3295 Tautology 构造 stack
- 【POJ 3295】Tautology 前缀式计算
- poj 3295 Tautology