直接枚举搜索就可以了。感觉usaco上的难度安排有很多不合理的地方,有些题很简单,有些题又很难。
以后做这种题得细心了,虽然一次过了,但改了很久。
/*
ID:
LANG: C++
TASK: zerosum
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <vector>
#define IN "zerosum.in"
#define OUT "zerosum.out"
using namespace std;
const char ch[3] = {' ', '+', '-'};
int N;
vector<char> res;
char t;
void solve(int num, int data, int sum)
{ //num: 当前位数, data: 当前数字, sum: 当前和
res.push_back(char(num + '0'));
if(num == N) {
if(sum == 0) {
for(vector<char>::iterator it = res.begin(); it != res.end(); it++)
cout << *it;
cout << endl;
}
res.pop_back();
return ;
}
for(int i = 0; i < 3; i++) {
res.push_back(ch[i]);
int tmp_sum;
int tmp_data;
if(ch[i] == ' ') {
tmp_sum = t == '-' ? (sum + data - (data * 10 + num + 1)) : (sum - data + data * 10 + num + 1);
tmp_data = data * 10 + num + 1;
}
else {
tmp_data = num + 1;
if(ch[i] == '+') {
t = '+';
tmp_sum = sum + num + 1;
}
else {
t = '-';
tmp_sum = sum - (num + 1);
}
}
solve(num + 1, tmp_data, tmp_sum);
res.pop_back();
}
res.pop_back();
}
int main()
{
freopen(IN, "rb", stdin);
freopen(OUT, "wb", stdout);
while(scanf("%d", &N) != EOF) {
t = '0';
res.clear();
solve(1, 1, 1);
}
return 0;
}