相邻数字之间只有‘ ’,‘+’,‘-’三种可能,故当N=9时,最多只有3^8种情况。可以DFS,也可以采用三进制数来枚举,怎么也不超时。
/*
ID: xpli1
PROG: zerosum
LANG: C++
*/
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
#define IN fin
#define OUT fout
#define max(a,b) (((a) > (b)) ? (a) : (b))
ifstream fin ("zerosum.in", ios::in);
ofstream fout("zerosum.out",ios::out);
int n;
char seq[17];
char chs[3] = {' ','+','-'};
int calc(int i){
int k;
for(k = 2 * n - 3; k >= 0; k -= 2){
seq[k] = chs[i % 3];
i /= 3;
}
int sum = 0;
int temp = 0;
char oper = '+';
for(k = 0; k < 2 * n - 1; k++){
if(seq[k] >= '1' && seq[k] <= '9'){
temp += (seq[k] - '0');
}
else if(seq[k] == ' ') {temp *= 10;}
else{
if(oper == '+') { sum += temp;}
else { sum -= temp; }
oper = seq[k];
temp = 0;
}
}
if(oper == '+') { sum += temp;}
else { sum -= temp; }
return sum;
}
int main(){
IN >> n;
int i,j=1;
for(i = 0; i < 2 * n - 1; i += 2){ seq[i] = '0'+j; j++; }
int CASE = 1;
for(i = 1; i < 2 * n - 1; i += 2) {CASE *= 3;}
for(i = 0; i < CASE; i++){
int res = calc(i);
if(res == 0){
for(j = 0; j < 2 * n - 1; j++){ OUT << seq[j];}
OUT << endl;
}
}
return 0;
}