算法分析:
设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; }