解法一
#include <iostream>
#include <vector>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
void print(vector<char> str){
for(int i=0;i<str.size();++i){
cout<<str[i];
}cout<<endl;
}
void solve(int start,int n,int sum,vector<char> str,vector<vector<char> > &vec){
int i,num=0,tmp=0;
if(start>n){
return;
}
if(abs(sum)>1416){
return;
}
if(start==1)
str.push_back('+');
bool op=false;
//print(str);
if(str[str.size()-1]=='+')op=true;
for(i=start;i<=n;++i){
if(i>9){
num=num*100+i;
}else{
num=num*10+i;
}
tmp=op?sum+num:sum-num;
str.push_back(i+'0');
if(tmp==0&&i==n){
vec.push_back(str);
return;
}
str.push_back('-');
solve(i+1,n,tmp,str,vec);
str.pop_back();
str.push_back('+');
solve(i+1,n,tmp,str,vec);
str.pop_back();
}
}
int main()
{
// freopen("out.txt","w",stdout);
int n;
vector<char> str;
vector<vector<char> > vec;
while(cin>>n){
solve(1,n,0,str,vec);
for(int i=vec.size()-1;i>=0;--i){
str=vec[i];
for(int j=1;j<str.size();++j){
if(str[j-1]!='+'&&str[j-1]!='-'&&str[j]!='+'&&str[j]!='-')
cout<<" ";
if(str[j]=='+'||str[j]=='-'){
cout<<str[j];
}else{
cout<<str[j]-'0';
}
}
cout<<endl;
}
str.clear();
vec.clear();
}
return 0;
}
解码二
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
typedef unsigned long long UINT;
int ops[21];
const char sym[3] = {'+', '-', ' '};
int n;
void dfs(int layer, long long currentResult, int lastOp, UINT lastSum)
{
lastSum *= (layer > 9)? 100: 10;
lastSum += layer;
if(layer == n)
{
currentResult += (lastOp)? (-1 * lastSum): lastSum;
if(currentResult == 0)
{
printf("1");
for(int i = 2; i <= n; i++)
printf("%c%d", sym[ops[i-1]], i);
printf("\n");
}
return;
}
ops[layer] = 2;
dfs(layer+1, currentResult, lastOp, lastSum);//Continue
currentResult += (lastOp)? (-1 * lastSum): lastSum;
ops[layer] = 0;
dfs(layer+1, currentResult, 0, 0);//Plus
ops[layer] = 1;
dfs(layer+1, currentResult, 1, 0);//Minus
}
int main(void)
{
//freopen("out.txt","w",stdout);
while(~scanf("%d", &n))
dfs(1, 0, 0, 0);
return 0;
}