POJ 3295

#include <algorithm>
#include <string>
#include <map>
#include <set>
#include <assert.h>
#include <iostream>
#include <vector>
#include <stack>

using namespace std;
string ss;
vector<char> vector1;
stack<char> stack1;
int pos;

bool cmp(char a) {
    return a == vector1[pos];
}

char getres(char op, char a, char b) {
    switch (op) {
        case 'K':
            if (a == '1' && b == '1')
                return '1';
            return '0';
        case 'A':
            if (a == '1' || b == '1')
                return '1';
            return '0';
        case 'C':
            if (a == '1' && b == '0')
                return '0';
            return '1';
        case 'E':
            bool flag;
            flag = a == b;
            if (flag)
                return '1';
            return '0';
        default:
            break;
    }
}

bool computeExp(string &s) {
    //这道题目可以看成是一道前缀表达式的计算问题,用栈来模拟式最合适的
    for (int i = s.size() - 1; i >= 0; i--) {
        if (isupper(s[i])) {//说明是一个运算符号
            if (ss[i] == 'N') {
                char a = stack1.top();
                stack1.pop();
                a = (a == '1') ? '0' : '1';
                stack1.push(a);
            } else {
                char a = stack1.top();
                stack1.pop();
                char b = stack1.top();
                stack1.pop();
                stack1.push(getres(s[i], a, b));
            }
        } else{
            stack1.push(s[i]);
        }
    }
    assert(stack1.size()==1);
    char res = stack1.top();stack1.pop();
    return res=='1';
}

bool dfs(int ix, string &s) {
    if (ix == vector1.size()) {
        //说明到了一种情况
//        cout << s << endl;
        //计算这种情况是否可以
        if (!computeExp(s))
            throw "error";
        return true;
    }
    //检查0是否满足
    //检查1是否满足
    //将ss中的ss[ix]替换为0;
    pos = ix;
    string temp = s;
    replace_if(temp.begin(), temp.end(), cmp, '0');
    dfs(ix + 1, temp);
    //将ss中的ss[ix]替换为1;
    temp = s;
    pos = ix;
    replace_if(temp.begin(), temp.end(), cmp, '1');
    dfs(ix + 1, temp);
    return true;
}

int main() {
//    freopen("../in.txt", "r", stdin);
    while (cin >> ss && ss != "0") {
        //首先统计变量的个数
        set<char> set1;
        for (int i = 0; i < ss.size(); ++i) {
            if (islower(ss[i]))
                set1.insert(ss[i]);
        }
        set<char>::iterator it = set1.begin();
        for (; it != set1.end(); it++)
            vector1.push_back(*it);
        //遍历每一种情况
        //就是让其中的每个元素有两个状态,然后去检验
        //现在的问题是循环的层数不能确定,dfs是一个有力的工具
        try {
            dfs(0, ss);
            cout << "tautology" << endl;
        } catch (...) {
            cout << "not" << endl;
        }
        vector1.clear();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值