DFS 全排列和子集排列
给定一个不含重复数字的数组nums,返回其所有可能的全排列 。按照任意顺序返回答案
输入
1 2 3
输出
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
#include <iostream>
using namespace std;const int N = 10;
int nums[N]; // 存储输入的原始数组(从命令行读入)
int n = 0; // 记录数组实际长度
int path[N]; // 当前构造的排列
bool state[N]; // 标记某个数字是否被用过(值为true表示已用)
// 深度优先搜索函数:递归构造排列
void dfs(int u) {
// 终止条件:当前已经放了n个数字,排列完成
if (u == n) {
for (int i = 0; i < n; i++) cout << path[i] << " ";
cout << endl;
return;
}
// 枚举当前这一层可以选择的每个数字
for (int i = 0; i < n; i++) {
// nums[i] 这个值如果没被用过,就可以放入当前位置
if (!state[nums[i]]) {
path[u] = nums[i]; // 把 nums[i] 放在当前排列的第 u 个位置
state[nums[i]] = true; // 标记这个数已经被使用了dfs(u + 1); 直到u==n,return进入下一步
state[nums[i]] = false; // 回溯:恢复现场,把这个数字释放掉,让别的路径可以用
}
}
}
int main() {
// 从命令行读取一行数字,存入 nums 数组
while (cin >> nums[n]) n++;dfs(0); // 从第0个位置开始填数字
return 0;
}
题目内容
给你一个整数数组nums,数组中的元素互不相同 。返回该数组所有可能的子集(幂集)。
解集不能包含重复的子集。按照任意顺序返回解集。
样例1
输入
1 2 3
输出
1
1 2
1 2 3
1 3
2
2 3
3
#include <iostream>
using namespace std;const int N = 10;
int nums[N]; // 存储输入的整数数组
int path[N]; // 存储当前构造的子集(递归中选的数)
int n = 0; // 实际输入的数字个数(数组长度)// 深度优先搜索函数
// u 表示当前从 nums[u] 开始往后选数
// k 表示当前 path[] 中已经选了多少个数(也是 path 的长void dfs(int u, int k) {
for (int i = 0; i < k; i++) {
cout << path[i] << " ";
}
cout << endl;
注意这里:i=u。 path[k] = nums[i]; dfs(i+1,k+1)
// ✅ 从 u 开始枚举后续的数(防止重复)
for (int i = u; i < n; i++) {
path[k] = nums[i]; // 把 nums[i] 当前构造的末尾
dfs(i + 1, k + 1); // 递归到下一层,从 i+1 位置继续选,path 长度加 1
}
}
int main() {
// ✅ 动态读取用户输入(直到换行结束)
while (cin >> nums[n]) n++;// ✅ 从第 0 个数开始构造子集,path 初始长度为 0
dfs(0, 0);return 0;
}
更多推荐

所有评论(0)