zoukankan      html  css  js  c++  java
  • 输出排列 递归、回溯法

    前缀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
  • 相关阅读:
    STM32的DMA
    STM32 入门之 GPIO (zhuan)
    CRC校验码 代码
    actan函数 查表法
    UART 和 USART 的区别
    STM32的NVIC理解
    STM32_adc
    STM 32 can 实例代码
    在Visual C#中调用API的基本过程
    贴片电阻阻值标识
  • 原文地址:https://www.cnblogs.com/helloworld2019/p/10348756.html
Copyright © 2011-2022 走看看