30,230
社区成员




递归实现排列枚举II
给定一个长度为 n的可包含重复数字的序列,请你求出其所有不重复的全排列。
第一行包含整数 n。
第二行包含 n 个整数。
输出所有的不同排列,每种排列占一行。
在确定每种排列的输出顺序时,第一个数较小的先输出,第一个数相同时,第二个数较小的先输出,以此类推。
数据范围
1≤n≤9,
数组中包含的元素的取值范围 [1,9]
3
1 1 2
1 1 2
1 2 1
2 1 1
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
int a[10];
bool vis[10];
int b[10];
int n;
void dfs(int step)
{
//递归出口
if(step==n)
{
for(int i=0;i<n;i++) cout<<b[i]<<" ";
cout<<endl;
return ;
}
//递归条件
for(int i=0;i<n;i++)
{
if(vis[i]==false)
{
vis[i]=true;
b[step]=a[i];
dfs(step+1);
vis[i]=false; //回溯
while(i+1<n&&a[i+1]==a[i]) i++; //回溯后对下一个结点进行限制
}
}
}
int main()
{
cin>>n;
for(int i=0;i<n;i++) cin>>a[i];
sort(a,a+n); //排序后方便去重
dfs(0);
return 0;
}
1.while的作用:在全排列的基础上,对重复分支去重
2.在套dfs模板之前,先分析清楚整个过程,再灵活对条件修改。