”递归+回溯“思想:n个数,每个数都有机会成为前缀的树,比如n=={a1,a2},–{a1,a2},{a2,a1};
n=3,{a1,a2,a3},处于前缀的有{a1,…},{a2,…},{a3,…};后面的两个数情况雷同n=2;
所以n>=3时,全排列的情况有:第一个位置:n,第二个位置:(n-1),… n!种情况.
代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
void dfs(int a[],int k,int n);
int n,a[10];
cin>>n;
for(int i=1;i<=n;i++)
a[i]=i;
dfs(a,1,n);
return 0;
}
void dfs(int a[],int k,int n)
{
void swap(int &a,int &b);
if(k==n) //当前查找的位置为n,递归终止
{
for(int i=1;i<=n;i++)
cout<<a[i]<<" “;
printf(”\n");
}
else{
for(int i=k;i<=n;i++)
{
swap(a[i],a[k]);
dfs(a,k+1,n);
swap(a[i],a[k]); //回溯标记清除
}
}
}
void swap(int &a,int &b)
{
int temp;
temp=a;
a=b;
b=temp;
}
递归求解全排列问题
最新推荐文章于 2021-12-24 00:43:25 发布