转载请注明出处:http://blog.csdn.net/u010734277
给定了几个连接词跟命题标示符,然后判断是否是永真式。K是且,A是或,N是非,C是蕴涵,E是等价。
我用的方法是递归求解。前几次的时候一直是output limit exeeded,检查半天发现漏看了一个t,把t加上以后还是ole,然后开始从文件读数据测试。发现从文件读的时候只能读取第一组数据。把清除缓存语句删了能正常读取了,不过提交就是WA。然后发现最开始写的时候由于没有注意到t的存在,函数里面的临时变量命名就跟函数参数重了。改正以后就过了。
用position来记录当前已经计算到的地方。如果遇到pqrst就返回,如果是大写字母就向下一层递归。
代码如下:
#include<iostream>
#include<cstdio>
using namespace std;
int position=0;
bool LOGICALT(int p1,int q1,int r1,int s1,int t1,char PROOF[]){
if(PROOF[position]=='t'){
position++;
return t1;
}
if(PROOF[position]=='p'){
position++;
return p1;
}
if(PROOF[position]=='q'){
position++;
return q1;
}
if(PROOF[position]=='r'){
position++;
return r1;
}
if(PROOF[position]=='s'){
position++;
return s1;
}
if(PROOF[position]=='K'){
position++;
bool a1=LOGICALT(p1,q1,r1,s1,t1,PROOF);
bool a2=LOGICALT(p1,q1,r1,s1,t1,PROOF);
return a1&&a2;
}
if(PROOF[position]=='A'){
position++;
bool a1=LOGICALT(p1,q1,r1,s1,t1,PROOF);
bool t2=LOGICALT(p1,q1,r1,s1,t1,PROOF);
return a1||t2;
}
if(PROOF[position]=='N'){
position++;
bool a1=LOGICALT(p1,q1,r1,s1,t1,PROOF);
return !a1;
}
if(PROOF[position]=='C'){
position++;
bool a1=LOGICALT(p1,q1,r1,s1,t1,PROOF);
bool t2=LOGICALT(p1,q1,r1,s1,t1,PROOF);
if(a1&&!t2)return 0;
return 1;
}
if(PROOF[position]=='E'){
position++;
bool a1=LOGICALT(p1,q1,r1,s1,t1,PROOF);
bool t2=LOGICALT(p1,q1,r1,s1,t1,PROOF);
if(a1==t2)return 1;
return 0;
}
}
int main(){
// freopen("data.txt","r",stdin);
while(1){
position=0;
char PROOF[105];
scanf("%s",PROOF);
// for(int i=0;i<strlen(PROOF);++i){
// cout<<PROOF[i];
// }
// cout<<endl;
//fflush(stdin);
if(PROOF[0]=='0')break;
int p1,q1,r1,s1,t1;
bool can =1;
for(p1=0;p1<2;++p1){
for(q1=0;q1<2;++q1){
for(r1=0;r1<2;++r1){
for(s1=0;s1<2;++s1){
for(t1=0;t1<2;++t1){
position=0;
if(!LOGICALT(p1,q1,r1,s1,t1,PROOF)){can=0;}
}
}
}
}
}
if(!can)cout<<"not"<<endl;
else cout<<"tautology"<<endl;
}
return 0;
}