码迷,mamicode.com
首页 > 其他好文 > 详细

poj 3295 Tautology

时间:2014-10-25 01:59:07      阅读:223      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   io   os   ar   使用   for   

题目链接http://poj.org/problem?id=3295

 

思路

判断逻辑表达式是否为永真式问题。根据该表达式的特点,逻辑词在逻辑变量前,类似于后缀表达式求值问题。

算法中使用两个栈,从表达式的后边开始处理表达式中每个字符;若为逻辑变量,使其入栈SR,否则从栈SR中弹出两个逻辑变量,进行运算后的结果再入栈SR;直到处理完表达式所有的字符。

注:使用栈可以很好的处理广义表类似的序列

 

代码

#include <iostream>
#include <stack>
using namespace std;

const int MAX_N = 1000 + 10;
char A[MAX_N];

int p, q, r, s, t, ans;

int Match( char x )
{
    int value = 0;

    switch(x)
    {
        case 0:value = 0; break;
        case 1:value = 1; break;
        case p:value = p;break;
        case q:value = q;break;
        case r:value = r;break;
        case s:value = s;break;
        case t:value = t;break;
        default: value = p;
    }

    return value;
}

int Calc( char a, char b, char T )
{
    int x, y, ans;

    x = Match( a );
    y = Match( b );
    switch( T )
    {
        case K:ans = x && y;break;
        case A:ans = x||y;break;
        case N:ans = !x;break;
        case C:ans = (!x)||y;break;
        case E:ans = (x == y);break;
    }
    return ans;
}


int WWF( )
{
    int Rusult = 0;
    int Len = strlen( A );
    stack<char>SL, SR;

    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 ){

        for ( int i = 0; i < Len; ++i )
                SL.push( A[i] );

            while ( !SL.empty() )
            {
                char x, y, T;
                int flag = 0;

                T = SL.top();SL.pop();

                switch(T)
                {
                    case p:
                    case q:
                    case r:
                    case s:
                    case t: SR.push(T);flag = 1;break;
                }

                if ( flag == 1 )
                    continue;
                else
                if ( T == N )
                {
                    x = SR.top();SR.pop();
                    ans = Calc( x, x, T );
                }
                else
                {
                    x = SR.top();SR.pop();
                    y = SR.top();SR.pop();
                    ans = Calc( x, y, T );
                }

                SR.push( ans + 0 );
            }

            if ( ans == 0 )
                return 0;
        }

    return 1;
}


int main()
{
    int flag = 0;

    while ( scanf( "%s", A ) != EOF )
    {
        if ( A[0] == 0 )
            break;

        flag = WWF();

        if ( flag == 0 )
            printf( "not\n" );
        else
            printf( "tautology\n" );
    }

    return 0;
}

 

poj 3295 Tautology

标签:style   blog   http   color   io   os   ar   使用   for   

原文地址:http://www.cnblogs.com/tallisHe/p/4049626.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!