DFS
重点是路径记录问题
内存允许的情况下可以用数组
还有一个方法三进制枚举路径然后一个一个进行可行性检查
#include <iostream>
#include <fstream>
#include <string>
//#define LOCAL
using namespace std;
#ifdef LOCAL
ofstream fout ("out.txt");
ifstream fin ("in.txt");
#else
ofstream fout ("zerosum.out");
ifstream fin ("zerosum.in");
#endif
int cengshu;
int num_res = 0;
int res[10000][10];
char c[] = {' ', '+', '-'};
void dfs(int ceng, int sum, int path, int last)
{
if(ceng==cengshu)
{
if(sum==0)
{
int temp=path;
int i = 0;
while(temp)
{
res[num_res][i++] = temp%10;
temp /= 10;
}
num_res++;
}
return;
}
if(ceng>cengshu)
return;
int temp_last;
if(last>=0)
temp_last = last*10+ceng+1;
else
temp_last = last*10-ceng-1;
dfs(ceng+1, sum-last+temp_last, path*10, temp_last);
dfs(ceng+1, sum+ceng+1, path*10+1, ceng+1);
dfs(ceng+1, sum-ceng-1, path*10+2, -ceng-1);
return;
}
int main() {
fin>>cengshu;
dfs(1, 1, 0, 1);
for (int i = 0; i < num_res; ++i)
{
for (int j = 1; j < cengshu ; ++j)
{
int temp = cengshu-1-j;
fout<<j<<c[res[i][temp]];
}
fout<<cengshu<<endl;
}
return 0;
}
发现把路径用字符串放在函数参数里边会更方便,可行后直接输出即可