poj3295 Tautology

标签: 构造 模拟 poj3295 Tautology
2人阅读 评论(0) 收藏 举报
分类:

//题意:p,q,r,s,t分别带别可0可1的数字,A(w,x),N,E(w,x),C(w,x),K(w,x),分别代表逻辑运算分别为或、非、是否相等、非w或x、与;当然这里的w,x只是举例实则是pqrst,然后目的给你一个传操作若是永真式输出一个tautology,否则输出not

//思路:自己构造一个栈,因为每种操作数都是在操作符后面的,从右向左入栈方便操作简单具体见代码(【注意】有个很奇怪的地方刚开始觉得state数组可以开10个本以为,后面发现小了,但是他报的错误是TLE让我无限懵逼了很久到现在也没想懂为什么)

#include <iostream>
#include <cstring>
#include <cstdio>

using namespace std;

char str[200];
int state[100];
int p, q, r, s, t;
int str_len;

void calculate()
{
    int top = 0;
    for(int i = str_len - 1; i >= 0; i--){
        if(str[i] == 'p'){
            state[top++] = p;
        } else if(str[i] == 'q'){
            state[top++] = q;
        } else if(str[i] == 'r'){
            state[top++] = r;
        } else if(str[i] == 's'){
            state[top++] = s;
        } else if(str[i] == 't'){
            state[top++] = t;
        } else if(str[i] == 'K'){
            state[top-2] = state[top-2] & state[top-1];
            top--;
        } else if(str[i] == 'A'){
            state[top-2] = state[top-2] | state[top-1];
            top--;
        } else if(str[i] == 'N'){
            state[top-1] = !state[top-1];
        } else if(str[i] == 'C'){
            state[top-2] = !state[top-1] | state[top-2];
            top--;
        } else if(str[i] == 'E'){
            state[top-2] = state[top-2] == state[top-1] ? 1 : 0;
            top--;
        }
    }
}

bool solve()
{
    bool ans;
    for(p = 0; p < 2; p++){
        for(q = 0; q < 2; q++){
            for(r = 0; r < 2; r++){
                for(s = 0; s < 2; s++){
                    for(t = 0; t < 2; t++){
                        calculate();
                        if(state[0] == 0)
                            return false;
                    }
                }
            }
        }
    }
    return true;
}

int main()
{
    while(scanf("%s", str) != EOF){
        str_len = strlen(str);
        if(strcmp(str, "0") == 0)
            break;
        if(solve()){
            printf("tautology\n");
        } else {
            printf("not\n");
        }
    }
    return 0;
}
查看评论

POJ - 3295 - Tautology (构造)

题目传送:Tautology 思路:枚举所有变量可能的值(0或1),算出其表达式的值,因为题目是要求是否是永真式,求式子的真值可以用栈来求,栈的话,可以自己构造一个栈,也可以用STL的sta...
  • u014355480
  • u014355480
  • 2015-05-06 17:07:31
  • 916

POJ3295Tautology(构造法)

Tautology Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12088   Acc...
  • llzhh
  • llzhh
  • 2016-10-02 17:21:48
  • 824

POJ3295 Tautology

拿到这个题之后彻底的懵逼了,好长时间没有练。在网上看了一个解题方法,醍醐灌顶。题目,解题思路。但是左看右看感觉它有两个地方写的有问题,linkstack类型和Stack类在使用new 的时候定义成了数...
  • u011806194
  • u011806194
  • 2016-08-29 20:30:13
  • 227

POJ3295——Tautology

POJ3295 /* *********************************************************** 算法原理: WFF求值,从表达式的末尾向前读取字符,并...
  • zykimmy
  • zykimmy
  • 2015-12-06 17:44:27
  • 140

POJ3295 Tautology

大概题意:输入为含有p, q, r, s,  t代表的 五个逻辑变量及K, A, N, C, E代表的五个基本逻辑连接词的字符串,输出即判断是否为永真式。 思路:参照http://blog.csdn...
  • apple140452
  • apple140452
  • 2016-05-21 16:01:40
  • 132

Tautology poj3295

Tautology Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12475   Accepted: 4749 ...
  • Gentle_Guan
  • Gentle_Guan
  • 2016-12-31 10:47:14
  • 198

(前缀表达式)poj3295 Tautology

Tautology Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9307   Acce...
  • LycenYao
  • LycenYao
  • 2014-07-15 20:32:03
  • 271

poj3295 Tautology(构造法)

Description WFF 'N PROOF is a logic game played with dice. Each die has six faces representing so...
  • lxy767087094
  • lxy767087094
  • 2016-09-22 21:43:48
  • 149

poj3295——Tautology(构造法)

DescriptionWFF ‘N PROOF is a logic game played with dice. Each die has six faces representing some s...
  • blue_skyrim
  • blue_skyrim
  • 2016-12-16 17:35:48
  • 605

POJ3295 tautology 解题报告

题意: 输入由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为逻辑运...
  • zhcntmm
  • zhcntmm
  • 2012-04-08 14:51:56
  • 200
    个人资料
    持之以恒
    等级:
    访问量: 3万+
    积分: 1824
    排名: 2万+
    最新评论