首页 > 其他 > 详细

输出排列 递归、回溯法

时间:2019-02-02 17:35:42      阅读:187      评论:0      收藏:0      [点我收藏+]

技术分享图片

 

前缀List[0...k-1],  后缀为list[k..m]

(没有前缀)从第0个元素开始,起始位置list[0] 与list[0...n-1] 这N个元素交换位置,确定第0位的元素

前缀list[0] 后缀为list[1...n-1]  ,将list[1]这个元素与list[2...n-1] 交换位置

类推直到,后缀为list[n-1]的时候输出

递推会改变原有的排列顺序,我们需要运用回溯法,

技术分享图片
#include<iostream>
using namespace std;
int n;
template<class T>
inline void Swap(T &a,T &b){
    T temp=a;
    a=b;
    b=temp;
}
template<class T>
void Perm(T list[],T k,T m){
//生成list[k...m]的所有排列方式
int i;
if(k==m){
    for(int i=0;i<=m;i++) 
    cout<<list[i];
    cout<<endl;
} else //list[k..m]多种排列方式
{
    for(i=k;i<=m;i++){
        swap(list[k],list[i]);
        Perm(list,k+1,m);
        Swap(list[k],list[i]);//还原保证list的完整性 
    }
} 
} 

int main()
{
//    int n;
    while(cin>>n) {
        int a[n];
        for(int i=0;i<n;i++) cin>>a[i];
        Perm(a,0,n-1);
    }
}
View Code

 

输出排列 递归、回溯法

原文:https://www.cnblogs.com/helloworld2019/p/10348756.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!