poj-3295-Tautology

题目地址

题目大意

  • p, q, r, _s, t是取值0或1的变量
  • K,A,N,C,E是操作
  • 给出一个表达式,问这个逻辑表达式是否为永真式。

解题思路

  • 使用stack
  • 遍历p, q, r, _s, t
  • 遍历整个字符串,当遇到变量 p, q, r, s ,t 则将其当前的值压栈;遇到 K,A,N,C,E进行出栈操作后入栈
  • 最终判断是否为永真式

代码

#include <iostream>
#include <stdio.h>
#include <stack>
#include <stdlib.h>
#include <algorithm>
#define INF 0x3fffffff
#define _N  505

typedef long long LL;

using namespace std;

int p, q, r, _s, t;
stack<int> s;

bool is_var(char c) {
    switch(c) {
        case 'p': s.push(p); return true;
        case 'q': s.push(q); return true;
        case 'r': s.push(r); return true;
        case 's': s.push(_s); return true;
        case 't': s.push(t); return true;
        default: return false;
    }
}

void op(char c) {
    int x, y;
    switch(c) {
        case 'K': x = s.top(); s.pop(); y = s.top(); s.pop(); s.push(x&y); break;
        case 'A': x = s.top(); s.pop(); y = s.top(); s.pop(); s.push(x|y); break;
        case 'N': x = s.top(); s.pop(); s.push(!x); break;
        case 'C': x = s.top(); s.pop(); y = s.top(); s.pop(); s.push((!x) || (x&y)); break;
        case 'E': x = s.top(); s.pop(); y = s.top(); s.pop(); s.push(x==y); break;
        default: break;
    }
    return ;
}

int main() {
#ifndef ONLINE_JUDGE
    freopen("in.txt", "r", stdin);
#else
    //
#endif
    string wff;
    while (cin >> wff && wff != "0") {
        if (wff[0] == '0') break;
        while(!s.empty()) s.pop();
        bool flag = true;
        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 = wff.size()-1; i >= 0; i--) {
                                if (!is_var(wff[i])) {
                                    op(wff[i]);
                                }
                            }
                            int ans = s.top();
                            s.pop();
                            if (!ans) {
                                flag = false;
                                break;
                            }
                        }
                        if (flag == false) break;
                    }
                    if (flag == false) break;
                }
                if (flag == false) break;
            }
            if (flag == false) break;
        }
        if (flag == false) {
            printf("not\n");
        } else {
            printf("tautology\n");
        }
    }
    return 0;
}

参考

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值