大意是输入一个数n,在1~n中插入运算符号,+、-和空格,如果是空格,那么就把两个数连起来,比如1+2+3 4就是1+2+34的意思,求出所有可能的结果为0的算式。 输入样例
7
输出样例
1+2-3+4-5-6+7
1+2-3-4+5+6-7
1-2 3+4+5+6+7
1-2 3-4 5+6 7
1-2+3+4-5+6-7
1-2-3-4-5+6+7
#include<bits/stdc++.h>
using namespace std;
int n;
int c[18];
map<string,bool> mp;
void dfs(int now){
if(now==n+1){
int t=1,last;
for(int i=2;i<=n;i++){
if(c[i]==1) t+=i,last=1;
if(c[i]==2) t-=i,last=2;
if(c[i]==3){
int k=0;
for(int j=i-1;j<=n;j++){
if(c[j+1]==3) k=k*10+j;
else{
i=j;
break;
}
}
if(last==1) t+=k;
else if(last==2) t-=k;
else t=k;
}
}
if(t==0){
string x;
for(int i=1;i<=n;i++){
if(c[i]==1) x+='+';
if(c[i]==2) x+='-';
if(c[i]==3) x+=' ';
x+=char(i+'0');
}
if(mp[x]==0){
for(int i=1;i<=n;i++){
if(c[i]==1) printf("+");
if(c[i]==2) printf("-");
if(c[i]==3) printf(" ");
printf("%d",i);
}
printf("\n");
mp[x]=1;
}
}
return ;
}
c[now+1]=1;
dfs(now+1);
c[now+1]=2;
dfs(now+1);
c[now+1]=3;
dfs(now+1);
return ;
}
int main(){
scanf("%d",&n);
dfs(1);
return 0;
}