一、算法分析
刚开始打算用搜索,在dfs函数中记录每次累加的值,然后看到数据规模相当小,于是就直接写了一个dfs爆搜所有的运算符可能,然后再验证,这个验证过程是比较麻烦的,涉及一些细节问题。尤其是对于空格的处理。具体解释在代码里。
二、代码及注释
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
int n;
const int maxn=15;
char d[maxn]; //标记路径
const char chs[]={' ','+','-'};
void dfs(int cur){
if(cur==n){
//for(int i=1;i<=n-1;i++) cout<<d[i];
//cout<<endl;
char ch='+'; //这里先置为'+',因为可以认为任何一个表达式的开头都存在一个加号
int sum=0; //暂存运算符
int cnt=1; //暂存一下连着的数字
for(int i=1;i<=n-1;i++){ //挨个验证
if(d[i]!=' '){ //基本思路就是在每次碰到非空格的时候,把之前记录下来的数算到sum里,然后更新ch和cnt,如果碰到的是空格,就更新cnt
if(ch=='+') sum+=cnt;
if(ch=='-') sum-=cnt;
cnt=i+1;
ch=d[i];
}
else{
cnt=cnt*10+i+1; //如果有空格,已有的先乘以10,再加空格后的
}
}
if(ch=='+') sum+=cnt; //最后处理一下末尾
if(ch=='-') sum-=cnt;
if(sum==0){
printf("1");
for(int i=1;i<=n-1;i++) printf("%c%d",d[i],i+1);
printf("\n");
}
return;
}
for(int i=0;i<3;i++){
d[cur]=chs[i];
dfs(cur+1);
}
}
int main(){
scanf("%d",&n);
dfs(1);
return 0;
}