排列问题 需要用到used/vis来做标记。
思想
组合与排列的区别,回溯算法求解的时候,有何不同?| LeetCode:46.全排列_哔哩哔哩_bilibili
class Solution {
public:
vector<int>path;
vector<vector<int>>result;
void dfs(vector<int>& nums,vector<bool>&used)
{
//递归结束条件
if(path.size()==nums.size())result.push_back(path);
//单层搜索逻辑
for(int i=0;i<nums.size();i++)
{
if(used[i]==true)continue;//path已经收录过了,就直接跳过
used[i]=true;//把当前元素设为已经收录过了
path.push_back(nums[i]);//收录路径上果实
dfs(nums,used);
path.pop_back();
used[i]=false;
}
}
vector<vector<int>> permute(vector<int>& nums) {
result.clear();
path.clear();
vector<bool>used(nums.size(),false);
dfs(nums,used);
return result;
}
};
#include<iostream>
#include<vector>
using namespace std;
vector<int> path;
vector<vector<int>> result;
void dfs(int nums, vector<bool>& used) {
if (path.size() == nums) {
result.push_back(path);
return;
}
for (int i = 1; i <=nums; i++) {
if (!used[i]) {
used[i] = true;
path.push_back(i);
dfs(nums, used);
path.pop_back();
used[i] = false;
}
}
}
int main() {
int nums;
cin >> nums;
result.clear();
path.clear();
vector<bool> used(nums, false);
dfs(nums, used);
// 输出结果
for (const auto& vec : result) {
for (int num : vec) {
cout << num << " ";
}
cout << endl;
}
return 0;
}