1、1有重复元素的排列问题一 问题描述:设 R=r1,r2,r n是要进行排列的 n 个元素,其中 r1,r2rn 元素可能相同,请设计出一个算法,列出R 中元素的所有不同排列。 在给定的 n 以及待排列的 n 个元素,计算出这 n 个元素的所有不同排列。二 要求输入输出:输入:第一行是元素个数 n,1=n=15,接下来的 1 行是待排列的 n 个元素,元素中间不要加空格。输出:程序运行结束时,将计算出 n 个元素的所有不用排列,最后 1 行中的数是排列总数。例如:Input4aaccoutputaaccacacaccacaaccacaccaa6三 设计概要:1)数据类型定义:int j=0 定义
2、 j 初始为 0,用来计数总共排列数int n 输入排列元素的个数char list 定义数组 list 存放排列元素int k ;int m 数组中元素第 k 位到第 m 位的排列int flag 标识符2)程序流程图:void Perm(int k,int m)2YNN YN YNSwap(ai,ak)Perm(k+1,m);i+printf(“%s”,list);i=kk=mi+;不存在 k=ji 令 aj=aiSwap(ai,ak)return;i=m33)模块间的调用:main()Perm()四 详细算法设计:if (是否一个元素 )for(寻找到该排列元素)printf(输出该元素
3、);排列数加一else /还有多个元素待排列,递归产生排列for(从第 k 个直到第 m 个元素) flag=0;for(p=k;pi;p+)if(listp=listi)flag=1;if(flag=1) continue;Swap(listk,listi);Perm(list,k+1,m);Swap(listk,listi);void Swap(char void main() /main 函数,调用 swap 和 permint n;void Swap(char void Perm(char list,int k,int m);scanf(“%d“,char list16;scanf(“
4、%s“,list);Perm ( list, 0, n-1);printf(“%dn“,j);void Swap(char a=b;b=temp;6void Perm(char list,int k,int m) /产生 listk:m的所有排列 int i,p;int flag;void Swap(char if(k=m) /只剩下一个元素for( i = 0;i = m;i+)printf(“%c“,listi);j+;printf(“n“);else /还有多个元素待排列,递归产生排列for(i=k;i=m;i+) flag=0;for(p=k;pi;p+)if(listp=listi)flag=1;if(flag=1) continue;Swap(listk,listi);Perm(list,k+1,m);Swap(listk,listi);