zoukankan      html  css  js  c++  java
  • 递归算法实现全排列第二章

    算法分析: 

    设list是含有n个不同字符的字符串,

    perm(list,k-1,n)为list[0]~list[k-1]的所有全排列,perm(list,k,n)为list[0]~list[k]的全排列,

    perm(list,k-1,n)处理的字符个数比perm(list,k,n)处理的的字符少一个,

    假设perm(list,k-1,n)可求,对于list[k]位置,可以取list[0]~list[k]的任何值,再组合per(list,k-1,n),这得到perm(list,k,n).

     

    View Code
    #include <iostream.h>
    int num=0;
    inline void Swap(char *a, char *b)
    {// 交换a和b
        char temp = *a;
        *a = *b;
        *b = temp;
    }
    
    void Perm(char list[], int k, int m)
    { //生成list [k:m ]的所有排列方式
        int i;
        if (k == m) {//输出一个排列方式
            for (i = 0; i <= m; i++)
               cout<<list[i];
            num++;
            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]);
            }
    }
    
    int main()
    {
        int n;
        char s[100];
        cout<<"请输入您要排列的数的个数n:";
        cin>>n;
        cout<<"请输入要排列的数"; 
        for(int i=0;i<n;i++)
            cin>>s[i];         
        Perm(s,0,n-1);
        cout<<"一共有:"<<num<<"个组合";
        return 0;
    } 
  • 相关阅读:
    [OpenJudge] 反正切函数的应用 (枚举)(数学)
    [OpenJudge] 摘花生 (模拟)
    [OpenJudge] 宇航员(模拟)
    [OpenJudge] 显示器(模拟)
    背包问题
    BFS_最短路径
    链表
    网站
    网站
    洛谷_递归整理
  • 原文地址:https://www.cnblogs.com/aijianiula/p/2726504.html
Copyright © 2011-2022 走看看