【表达式求值】HDU 4192

比较水的算是表达式求值,枚举每个变量即可............表达式求值的时候有个地方漏了i--,贡献1wa

#define N 10005
char str[N];
int num[N];
char op[N];
int v[11];
int id[11];
char cmp(char a,char b){
    if(a=='+'){
        if(b=='+' || b=='-' || b==')')return '>';
        else return '<';
    }
    if(a=='-'){
        if(b=='+' || b=='-' || b==')')return '>';
        else return '<';
    }
    if(a=='*'){
        if(b=='(')return '<';
        else return '>';
    }
    if(a=='('){
       if(b==')')return '=';
       else return '<';
    }
    if(a==')'){
        return '>';
    }
}
int cal(int a,int b,char c){
    if(c=='+')return a+b;
    if(c=='-')return a-b;
    if(c=='*')return a*b;
}
int gao(){
    int i,j;
    int topnum = 0,topop = 1;
    int k = 1;
    op[1] = '(';
    for(i=1;str[i];i++){
        if(islower(str[i])){
            topnum++;
            num[topnum] = v[id[k++]];
        } else {
            char c = cmp(op[topop],str[i]);
            char tag;
            if(c=='<'){
                topop++;
                op[topop] = str[i];
            } else if(c=='='){
                topop--;
            } else if(c=='>'){
                int b = num[topnum--];
                int a = num[topnum--];
                tag = op[topop--];
                int res = cal(a,b,tag);
                topnum++;
                num[topnum] = res;
                i--;//fuck
            }
        }
    }
    return num[topnum];
}
int main(){
    int n;
    while(scanf("%d",&n) && n){
        int i,j;
        for(i=1;i<=n;i++){
            scanf("%d",&v[i]);
            id[i] = i;
        }
        int ans;
        scanf("%d",&ans);
        scanf("%s",str+1);
        int len = strlen(str+1);
        str[0] = '(',str[len+1] = ')',str[len+2] = '\0';
        bool ok =0;
        do{
            int tmp = gao();
            if(tmp==ans){
                ok = 1;
                break;
            }
        }while(next_permutation(id+1,id+1+n));
        if(ok)puts("YES");
        else puts("NO");
    }
    return 0;
}





















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值