当前位置 博文首页 > 爱新觉罗?炒饭的博客:排列问题(n个数的全排列)(递归)

    爱新觉罗?炒饭的博客:排列问题(n个数的全排列)(递归)

    作者:[db:作者] 时间:2021-07-07 15:33

    问题描述:设R={r1,r2,…,rn}是要迚行排列的n个元素,求R的全排列Perm?。
    问题分析:
    设(ri)perm(X)表示在全排列perm(X)的每一个排列前加上前缀得到的排列。
    解决方案:
    1.递归关系:perm?由(r1)perm(R1),(r2)perm(R2) ,…, (rn)perm(Rn)构 成,其中Ri=R-{ri}。
    2.终止条件:n=1时,Perm?=r ,r是R中的唯一元素
    3.参数设置:待排序数组List,开始下标k,终止下标m
    实现思想:将整组数中的所有的数分别不第一个数交换,这样就总是在处理后n- 1个数的全排列。

    代码如下:

    #include<bits/stdc++.h>
    using namespace std;
    int ans=0;
    void perm(int a[],int k,int m)
    {
    	if(k==m)
    	{
    		for(int i=0;i<=m;i++)
    		{
    			cout<<a[i]<<" ";
    		}
    		cout<<endl;
    		ans++;
    	 } 
    	 for(int i=k;i<=m;i++)
    	 {
    	 	swap(a[i],a[k]);
    	 	perm(a,k+1,m);
    	 	swap(a[k],a[i]);
    	 }
    }
    int main()
    {
    	int a[100],n;
    	cin>>n;
    	for(int i=0;i<n;i++)
    	   cin>>a[i];
    	perm(a,0,n-1);
    	cout<<ans<<endl;;
    	return 0;
     } 
    
    cs