设计一个算法在 1,2,……9(顺序不变)

题目

数值之间插入+或者-或者什么都不插入,
使得计算结果总是 100 的程序。
例如 1+2+34-5+67-8+9=100。
输出所有的答案。

算法标签

DFS 暴力搜索

代码

#include

using namespace std;

const int N=9;
int arr[N]={
     1,2,3,4,5,6,7,8,9};
char op[N];	//最多有九个符号

void func(int sum,int preAdd,int i){
     	//sum 总数 preAdd上一个添加的数字 i记录当前是第几个
        if(i==N){
     //选完前9个数字
            if(sum==100){
     //总数到100
                cout<<arr[0];//输出第一个数字
                for(int j=1;j<N;j++){
     
                    if(op[j]!=' ')cout<<op[j];//如果当前符号不是空格,就输出符号
                    cout<<arr[j];//输出数字
                }
                cout<<"=100"<<endl;
            }
            return ;
        }
        else {
     
            op[i]='+';//符号是+的情况
            func(sum+arr[i],arr[i],i+1);//记录状态
              
            op[i]='-';//符号是-的情况
            func(sum-arr[i],-arr[i],i+1);
            
            op[i]=' ';//符号是空格的状态
            int tmpN=0;//计算当前数字与前一个数字和一的新数字
            if(preAdd>0)tmpN=preAdd*10+arr[i];//如果前一个数字是正数 那么新的合就是正数
            else tmpN=preAdd*10-arr[i];
            func(sum-preAdd+tmpN,tmpN,i+1);//记录新状态 总数-上一个数字+新融合的数字 preAdd是新数字 i+1去选择下一个数字
        }
    }
    
int main(){
     
    
    func(arr[0],arr[0],1);//起始
    
    return 0;
}

输出

在这里插入图片描述

你可能感兴趣的:(dfs,dfs)