一维的dfs搜索得记录搜索了多少次数,先用数组存数字,打印时在做处理,
用一个数组记录每一次拆分的数字是多少,同时用一个指针ct指向上一个拆分出来的数字。
若这个数字为0,就代表找到一种答案,打印处理
对于第一个数字要进行特判,他不能大于n/2。
对于后面的不为0数字,枚举前先让ct++,ct偏移到当前位置
由于从小到大,所以从上一个拆分的数字开始枚举,(即从ct-1指向的开始)一直到x.
当枚举结束,能推出循环时即代表所以答案都枚举完毕,即当前位置已无答案,只能退回上一级,寻找答案,同时ct--偏移到上一级
#include <bits/stdc++.h>
using namespace std;
int n;
int a[1999];//记录各个拆分数字
int ct = 0;//记录当前位置的指针。
int dfs(int x) { //表示传进来的数字是几
if (x == 0) {
for (int i = 1; i < ct; i++)
cout << a[i] << "+";
cout << a[ct];
cout << endl;
return 0;
}
ct++ ;//开始枚举,指针ct先偏移
for (int i = a[ct - 1]; i <= x; i++) { //让i从上一个数字开始枚举
a[ct] = i;
dfs(x - i);
if (a[1] > n / 2)
return 0;
}
ct-- ;//全部答案都枚举完毕,返回到上一级枚举,ct偏移回去
return 0;
}
int main() {
a[0] = 1;
cin >> n;
dfs(n);
}