爱嘉牛LA

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

算法分析: 

设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;
} 
posted on 2012-10-16 18:35  爱嘉牛LA  阅读(155)  评论(0编辑  收藏  举报