您的位置:首页 > 其它

POJ 3295--Tautology

2017-10-05 20:55 405 查看
2017-10-05

原题链接

题目大意:

以K、A、N、C、E定义了5种逻辑操作,p、q、r、s、t是5个逻辑变量。给出若干由这10个字符组成的字符串(长度不超过100字符),如:ApNp,判断这个字符串表示的逻辑函数是否为重言式(即无论其中逻辑变量取值为何,表达式的值都为真),是则输出”tautology”,不是则输出”not”。

样例输入:

ApNp
ApNq
0


样例输出:

tautology
not


参考题解

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <stack>
#include <map>
using namespace std;
map<char,int> Map;

//判断是否为重言式
bool jud(char *iput,int p, int q, int r, int s, int t) {
stack<int> opNum;
int op1,op2;
//从后往前处理输入的字符串
for(int i = strlen(iput) - 1; i >= 0; i--) {
//需要两个操作数的操作
if(iput[i] == 'K' || iput[i] == 'A' || iput[i] == 'C' || iput[i] == 'E') {
op1 = opNum.top();  opNum.pop();
op2 = opNum.top();  opNum.pop();
switch(iput[i]) {
case 'K':
opNum.push(op1 && op2); break;
case 'A':
opNum.push(op1 || op2); break;
case 'C':
opNum.push((op1 && op2) || !op1);   break;
case 'E':
opNum.push(op1 == op2); break;
}
}
//只要一个操作数的“非”操作
else if(iput[i] == 'N') {
op1 = opNum.top();  opNum.pop();    opNum.push(!op1);
}
//操作数
else
opNum.push(Map[iput[i]]);
}
return opNum.top() == 1 ? true : false;
}

int main() {
char iput[110];
while(scanf("%s",iput), iput[0] != '0') {
bool flag = true;
for(int p = 0; p <=1 && flag; p++) {
Map['p'] = p;
for(int q = 0; q <= 1 && flag; q++) {
Map['q'] = q;
for(int r = 0; r <= 1 && flag; r++) {
Map['r'] = r;
for(int s = 0; s <= 1 && flag; s++) {
Map['s'] = s;
for(int t = 0; t <= 1 && flag; t++) {
Map['t'] = t;
//是否为重言式,一旦出现为0即跳出
flag = jud(iput,p,q,r,s,t);
}
}
}
}
}
if(flag) printf("tautology\n");
else     printf("not\n");
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: