匪警请拨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. 理解为一棵树,每棵树有三个节点,所依递归遍历;
  2. 可解节点应为算式的第一个元素即“ 1   ”;
  3. 回溯状态恢复

易错点

  1. 对于c++在于字符串的处理    在这个题目中 主要用到了字符串的拼接;    (C++直接对+进行了重载     所以string s0= string s1+string s2是合法的)
  2. itom()函数  (https://baike.baidu.com/item/itoa%E5%87%BD%E6%95%B0)
  3.     将字符串转换为对应十进制数字  ( 在代码中有具体体现); 

代码解析 

 

#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;
}

运行结果


posted @ 2018-03-28 23:22  Howbin  阅读(685)  评论(0编辑  收藏  举报