poj 3295 Tautology

来源:互联网 发布:淘宝单品流量怎么看 编辑:程序博客网 时间:2024/06/06 02:40

题意:
给出一个表达式,问这个表达式是否是永真式?是输出“tautology”,否则输出“not”。
其中p, q, r, s, t是变量,值为真或者假。
K, A, N, C, E分别为与、或、非、蕴含、判等操作
下面是真值表:

w x Kwx Awx Nw Cwx Ewx 1 1 1 1 0 1 1 1 0 0 1 0 0 0 0 1 0 1 1 1 0 0 0 0 0 1 1 1

分析:表达式最长不过100个字符,变量最多只有5个,枚举所有变量的状态,用栈模拟一下操作就行了。

#include <iostream>#include <cstring>#include <cstdio>using namespace std;const int N = 100;void solve(char s[]) {    static char var[26];    static bool v[26], stk[N];    int ls = strlen(s), index, cnt = 0, top = -1, tmp;    memset(v, 0 , sizeof(v));    for(int i = 0; i < ls; i++) {        if(islower(s[i])) {            index = s[i] - 'a';            if(!v[index]) {                var[cnt++] = s[i];                v[index] = 1;            }        }    }    for(int sta = 0; sta < (1 << cnt); sta++) {        tmp = sta;        for(int i = 0; i < cnt; i++) {            index = var[i] - 'a';            v[index] = tmp & 1;            tmp >>= 1;        }        for(int i = ls - 1; i >= 0; i--) {            if(islower(s[i])) {                index = s[i] - 'a';                stk[++top] = v[index];            }            else {                tmp = top;                switch(s[i]) {                    case 'K':                        stk[--top] &= stk[tmp];                        break;                    case 'A':                        stk[--top] |= stk[tmp];                        break;                    case 'N':                        stk[top] = !stk[top];                        break;                    case 'C':                        if(stk[top] == false) {                            stk[--top] = true;                        }                        else {                            stk[--top] &= stk[tmp];                        }                        break;                    default:                        stk[--top] = stk[tmp] == stk[tmp - 1] ? true : false;                }            }        }        if(!stk[top--]) {            puts("not");            return;        }    }    puts("tautology");}int main() {    //freopen("in.txt", "r", stdin);    char s[N];    while(scanf("%s", s) && s[0] != '0') {        solve(s);    }    return 0;}
0 0
原创粉丝点击