原题链接:Tautology
题目大意:p、q、r、s、t是逻辑变量,K、A、N、C、E是逻辑操作,相应的真值表已经给出。要求给定一个逻辑表达式,判断其是否为永真式,即无论其中的逻辑变量取值如何,其结果都为真。
大致思路:看到题目就感觉应该可以用递归实现,可怜太菜,不会实现,网上查了下解题报告,实现如下:
#include <cstdio>
char str[105];
int current;
int judge(int i) {
char ch = str[current++];
if(ch=='p' || ch=='q'|| ch=='r' || ch=='s' || ch=='t') return (i>>(ch-'p'))&1;
else if(ch=='K') return judge(i) & judge(i);
else if(ch=='A') return judge(i) | judge(i);
else if(ch=='N') return !judge(i);
else if(ch=='C') return (!judge(i)) | judge(i);
else if(ch=='E') return judge(i) == judge(i);
else return 0;
}
int main() {
int flag;
while(scanf("%s",str)==1 && str[0]!='0') {
flag = 1;
for(int i=0; i<32; i++) {
current = 0;
if(!judge(i)) {
flag = 0;
break;
}
}
if(flag) printf("tautology\n");
else printf("not\n");
}
return 0;
}
代码把五个变量的状态看成二进制数,共有32种可能,思路清晰,要好好学习!