uva10400

题目大意:
运算符号没有优先级的,给出的数字按顺序利用+ - * / 将结果得出来,如果的不出结果就输出无解。

思路:
感觉可以直接dfs

代码:

#include <iostream>
using namespace std;
#include <stdio.h>
#include <cstring>
#include <cmath>

int p[105],flag,vis[105][64001],num,target,o[105];

void solve(int sum,int d) {

    int i,s;
    if(d > num-1 && sum == target) flag = 1;
    if(flag || d >num-1 || abs(sum) >32000) return ;
    for(i = 1; i<= 4; i++) {
        o[d - 1] = i;
        s = 32001;
        if(i == 1) s = sum + p[d];
        if(i == 2) s = sum - p[d];
        if(i == 3) s = sum * p[d];
        if(i == 4 && (sum %p[d] == 0) && p[d]!= 0) s = sum/p[d];
        if(abs(s) <= 32000 && vis[d - 1][s] == 0) {
            vis[d - 1][s] = 1;
            solve(s,d+1);
        }
        if(flag) return ;
    }
}

int main() {

    int cases;
    scanf("%d",&cases);
    while(cases--) {
        scanf("%d",&num);
        for(int i = 0 ; i < num; i++)
            scanf("%d",&p[i]);
        scanf("%d",&target);
    //  cout << 1<<endl;
        flag = 0;
        memset(vis,0,sizeof(vis));
        solve(p[0],1);
//      cout << 1;
        if(flag) {
            for(int i = 0; i < num-1 ; i++) {
                printf("%d",p[i]);
                if(o[i] == 1) printf("+");
                if(o[i] == 2) printf("-");
                if(o[i] == 3) printf("*");
                if(o[i] == 4) printf("/");
            }
            printf("%d=%d\n",p[num - 1],target);
        }
        else
            printf("NO EXPRESSION\n");
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值