您的位置:首页 > 其它

POJ-3295-递归计算表达式

2017-11-07 20:23 344 查看
/*
poj-3295-递归模拟
每执行完一个操作,更新下一个可计算的位置n,初始为0
遇到变量,n就等于当前坐标+1,返回变量真假
*/
#include<stdio.h>
#include<string.h>

char wff[105];
int len;
bool p,q,r,s,t;
int n;

bool judge(char op,bool w,bool x){
if(op == 'K'){
return w && x;
}else if(op == 'A'){
return w || x;
}else if(op == 'C'){
return !w || x;
}else if(op == 'E'){
return w == x;
}
}
bool dfs(int i){
if(n == len || i == len){
printf("adadad\n");
return true;
}
if(wff[i] == 'K' || wff[i] == 'A' || wff[i] == 'C' || wff[i] == 'E'){
bool fi,se;
//printf("n = %d\n",n);
fi = dfs(i+1);//已经递归更新了下一个可用于计算的位置n,可以输出n看一下
//printf("n = %d\n",n);
se = dfs(n);
return judge(wff[i],fi,se);
}else if(wff[i] == 'N'){
return !dfs(i+1);;
}else if(wff[i] == 'p'){
n = i + 1;
//printf("n = %d\n",n);
return p;
}else if(wff[i] == 'q'){
n = i + 1;
return q;
}else if(wff[i] == 'r'){
n = i + 1;
return r;
}else if(wff[i] == 's'){
n = i + 1;
return s;
}else if(wff[i] == 't'){
n = i + 1;
return t;
}
}
int main(){
while(scanf("%s",wff) && wff[0] != '0'){
len = strlen(wff);
bool flag = true;
for(int i1 = 0;i1 <= 1;i1++){
p = i1;
for(int i2 = 0;i2 <= 1;i2++){
q = i2;
for(int i3 = 0;i3 <= 1;i3++){
r = i3;
for(int i4= 0;i4 <= 1;i4++){
s = i4;
for(int i5 = 0;i5 <= 1;i5++){
t = i5;
n = 0;
flag = flag && dfs(0);
}
}
}
}
}
if(flag){
printf("tautology\n");
}else{
printf("not\n");
}
//printf("n = %d\n",n);//4
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  递归 acm poj 模拟