POJ-3295-递归计算表达式

/*
    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
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值