1.问题阐述
设计一个算法在1、2、3... 9(顺序不能变)数字之间插入+ 或 - 或什么都不插入,使得计算结果总是100的程序,并输出所有的可能性。
思路:设置一个int型的arr[]存放数字1-9,op[]存放的是arr[]之前的操作符,sum每一步操作后的和(默认为arr[0]),tempArr存放的是上一层的数(arr[i]之前的数),i从1开始 ,n为数组长度。
代码:
#include<iostream>
using namespace std;
/*arr[]存放数字1-9,
op[]存放的是arr[]之前的操作符,
sum每一步操作后的和(默认为arr[0])
tempArr存放的是上一层的数(arr[i]之前的数),
i从1开始 ,n为数组长度*/
void dfs(int* arr,char* op,int sum,int tempArr,int i,int n){
if(i==n){
if(sum==100){
cout<<arr[0];//1无条件输出
for(int j=1;j<n;j++){
if(op[j]!=' '){
cout<<op[j];
}
cout<<arr[j];
}
cout<<"=100"<<endl;
}
return;
}
else{
//op[i]表示arr[i]之前的符号
//op[i]='+'的情况下
op[i]='+';
sum=sum+arr[i];
dfs(arr,op,sum,arr[i],i+1,n);
sum=sum-arr[i];//回溯
//op[i]='-'的情况下
op[i]='-';
sum=sum+(-arr[i]);
dfs(arr,op,sum,-arr[i],i+1,n);
sum=sum-(-arr[i]);//回溯
//op[i]=' '的情况下
int temp;//存放两层的数之间无符号的聚合值
op[i]=' ';
sum=sum-tempArr;//回到上上层
if(tempArr>0)
temp=tempArr*10+arr[i];
else
temp=tempArr*10+(-arr[i]);
sum=sum+temp;
dfs(arr,op,sum,temp,i+1,n);
//sum变了两次,也要回溯两次于最先的状态
sum=sum-temp;
sum=sum+tempArr;
}
}
int main(){
int a[9]={1,2,3,4,5,6,7,8,9};
char op[9];
dfs(a,op,a[0],a[0],1,9);
return 0;
}
结果: