蓝桥杯-基础训练-趣味算符填符号C++

题目

1 2 3 4 5 6 7 8 9 = 110;
请看上边的算式,为了使等式成立,需要在数字间填入加号或者减号(可以不填,但不能填入其它符号)。之间没有填入符号的数字组合成一个数,例如:12+34+56+7-8+9 就是一种合格的填法;123+4+5+67-89 是另一个可能的答案。
请你利用计算机的优势,帮助警察叔叔快速找到所有答案。
每个答案占一行。形如:
12+34+56+7-8+9
123+4+5+67-89

闲聊
嚯,看到第一眼觉得,完了,不会写,后来想想,就是dfs搜索,但是我比较傻,第一个搜索没写好,尝试改好,但是没成功,于是后来加了个map去重的,check检查。
不是很确定对不对,如果还有情况,请大佬给我说一下。
代码

#include<bits/stdc++.h>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
const double eps=3e-8;
const int mod=10;
const int maxn=2e5;
bool vis[11];
const double mon=82.3;
char ans[30];
map<string,int>ma;
//re:上一个的数
//sum:目前价值的和
//retan:当前常数项值,比如‘123’会经过‘12’
//flag:当前这个常数项的符号+——1 -——0
//cur:符号的位置
void dfs(int re,int sum,int retan,int flag,int cur){
    if(re>=9){
        if(sum==110){//只能初步筛选
            string s;
            for(int i=1;i<cur;i++){
                s+=ans[i];
                if(ans[i]=='9')break;
            }
            s+='=';
            ma[s]=0;
        }
        return;
    }
    ans[cur]=re+1+'0';
    int retan1=retan*10+re+1;
    dfs(re+1,sum,retan1,flag,cur+1);//这个是12->123衔接上去3的过程
    if(flag){//+设定
        ans[cur+1]='+';
        dfs(re+1,sum+retan1,0,1,cur+2);
        ans[cur+1]='-';
        dfs(re+1,sum+retan1,0,0,cur+2);
    }
    else {//-设定
        ans[cur+1]='+';
        dfs(re+1,sum-retan1,0,1,cur+2);
        ans[cur+1]='-';
        dfs(re+1,sum-retan1,0,0,cur+2);
    }
}
int check(string s){
    int sum=0;
    bool f=1;
    int temp=0;
    for(int i=0;i<s.size();i++){
        if(s[i]>'0'&&s[i]<='9')temp=temp*10+(s[i]-'0');
        else {
            if(f)sum+=temp;
            else sum-=temp;
            temp=0;
            if(s[i]=='+')f=1;
            else if(s[i]=='-')f=0;
            else break;
        }
    }
    return sum;
}
int main(){
    ans[0]='+';
    int flag=1;
    dfs(0,0,0,flag,1);
    int num=0;
    for(auto it:ma){
        it.second=check(it.first);
        if(it.second==110){
            cout<<it.first<<it.second<<endl;
            num++;
        }
    }
    cout<<"The numble of available status:"<<num<<endl;
    return 0;
}

最重要的结果
欢迎检验

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值