匪警请拨110——C++
问题描述
匪警请拨110,即使手机欠费也可拨通!
为了保障社会秩序,保护人民群众生命财产安全,警察叔叔需要与罪犯斗智斗勇,因而需要经常性地进行体力训练和智力训练!
某批警察叔叔正在进行智力训练:
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
……
解决思路
其实一开始是没有啥思路的,在听了于航老师的讲解讲解之后星辰了自己的一点想法。
- 理解为一棵树,每棵树有三个节点,所依递归遍历;
- 可解节点应为算式的第一个元素即“ 1 ”;
- 回溯状态恢复
易错点
- 对于c++在于字符串的处理 在这个题目中 主要用到了字符串的拼接; (C++直接对+进行了重载 所以string s0= string s1+string s2是合法的)
- itom()函数 (https://baike.baidu.com/item/itoa%E5%87%BD%E6%95%B0)
- 将字符串转换为对应十进制数字 ( 在代码中有具体体现);
代码解析
#include<iostream> #include<stdlib.h>//itoa() #include<cstring>//便于字符串处理 #include<math.h> using namespace std; int a[]={1,2,3,4,5,6,7,8,9};//解决该问题的数据结构 void Try(int k,string so,int goal ) //试探函数 { // cout<<"Goal: "<<goal<<endl; //调试中使用的输出 if(k==0) //递归出口 { if(a[0]==goal)//判断是否为问题的解 { cout<<a[0]<<so<<endl; // getchar(); //调试中使用的暂停 } return; } char temp_1[10]; //整形量转换字符量做准备,一个容器 itoa(a[k],temp_1,10); //比较实用的函数 string A; A=temp_1+so; A="+"+A; //拼接 数的第一个分支 // cout<<"A: "<<A<<endl; Try(k-1,A,goal-a[k]);//更新goal char temp_2[10]; itoa(a[k],temp_2,10); string B; B=temp_2+so; B="-"+B; // cout<<"B: "<<B<<endl; Try(k-1,B,goal+a[k]); //数的第二个分支 int x=a[k-1]; char lenth[10]; int j; itoa(a[k],lenth,10); //这个非常重要,要根据实际a[k]的长度来更新a[k-1],我就是在这里出现了无数次错误!!!! j=strlen(lenth); a[k-1]=a[k-1]*pow(10,j)+a[k]; // cout<<"so: "<<so<<endl; Try(k-1,so,goal); /* for(int i=0; i<9; i++) { cout<<a[i]<<"\t"; } cout<<endl;*/ a[k-1]=x;//回溯状态恢复 } int main() { Try(8,"",110); return 0; } #include<iostream> #include<stdlib.h> #include<cstring> #include<math.h> using namespace std; int a[]={1,2,3,4,5,6,7,8,9}; void Try(int k,string so,int goal ) { // cout<<"Goal: "<<goal<<endl; if(k==0) { if(a[0]==goal) { cout<<a[0]<<so<<endl; // getchar(); } return; } char temp_1[10]; itoa(a[k],temp_1,10); string A; A=temp_1+so; A="+"+A; // cout<<"A: "<<A<<endl; Try(k-1,A,goal-a[k]); char temp_2[10]; itoa(a[k],temp_2,10); string B; B=temp_2+so; B="-"+B; // cout<<"B: "<<B<<endl; Try(k-1,B,goal+a[k]); int x=a[k-1]; char lenth[10]; int j; itoa(a[k],lenth,10); j=strlen(lenth); a[k-1]=a[k-1]*pow(10,j)+a[k]; // cout<<"so: "<<so<<endl; Try(k-1,so,goal); /* for(int i=0; i<9; i++) { cout<<a[i]<<"\t"; } cout<<endl;*/ a[k-1]=x; } int main() { Try(8,"",110); return 0; }
运行结果
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ASP.NET Core 模型验证消息的本地化新姿势
· 对象命名为何需要避免'-er'和'-or'后缀
· “你见过凌晨四点的洛杉矶吗?”--《我们为什么要睡觉》
· 编程神器Trae:当我用上后,才知道自己的创造力被低估了多少
· C# 从零开始使用Layui.Wpf库开发WPF客户端
· C#/.NET/.NET Core技术前沿周刊 | 第 31 期(2025年3.17-3.23)
· 接口重试的7种常用方案!