赞
踩
6
算法思路 :
1)aacc四个元素的全排列,我们可以划分为3个元素的全排列,3个划分为2个,到最后只剩下1个元素,就不需要排列。
2)我们让每一个元素作为打头元素,交换,然后进行递归,再交换。
3)如果该打头元素在前面中已经有过,则忽略这种情况。
代码如下:
- #include<stdio.h>
- #include<string.h>
- int count=0;
- void swap(char &a,char &b)
- {
- char temp;
- temp=a;
- a=b;
- b=temp;
- }
- int finish(char list[],int k,int i)
- {//第i个元素是否在前面元素[k...i-1]中出现过
- if(i>k)
- {
- for(int j=k;j<i;j++)
- if(list[j]==list[i])
- return 0;
- }
- return 1;
- }
- void perm(char list[],int k,int m)
- {
- if(k==m) //当只剩下一个元素时则输出
- {
- count++;
- for(int i=0;i<=m;i++)
- printf("%c",list[i]);
- putchar('\n');
- }
- for(int i=k;i<=m;i++) //还有多个元素待排列,递归产生排列
- {
- if(finish(list,k,i))
- {
- swap(list[k],list[i]);
- perm(list,k+1,m);
- swap(list[k],list[i]);
- }
- }
- }
- int main()
- {
- int i,n;
- printf("请输入元素个数:\n");
- scanf("%d",&n);
- printf("请输入待排列的元素:\n");
- getchar();
- char *a=new char[n];
- for(i=0;i<n;i++)
- scanf("%c",&a[i]);
- printf("所有不同排列为:\n");
- perm(a,0,n-1);
- printf("排列总数为:%d\n",count);
- return 0;
- }
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。