还是向别人学习的 一道题目,是算法课后作业,时间关系,只能向别人请教了。
Description
设R={ r1, r2, ……, rn }是要进行排列的n个元素。其中元素r1 ,r2 ,……,rn可能相同。试设计一个算法,列出R的所有不同排列。
给定n以及待排列的n个元素。计算出这n个元素的所有不同排列。
Input
输入数据的的第1行是元素个数n,1≤n≤500。接下来的1行是待排列的n个元素。
Output
将计算出的n个元素的所有不同排列输出,每种排列占1行,最后1行中的数是排列总数。
Sample Input
4 aacc
Sample Output
aacc
acac
acca
caac
caca
ccaa
6
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std ;
long long ans;
int ok(char str[],int a ,int b )
{
if(b>a)
for(int i=a;i<b;i++)
if(str[i]==str[b])
return 0;
return 1;
}
void perm(char str[],int k,int m)
{
int i;
if(k==m)
{
ans++;
for(i=0;i<=m;i++)
printf("%c",str[i]);
printf("\n");
return ;
}
else for(i=k;i<=m;i++)
if(ok(str,k,i))
{
swap(str[k],str[i]);
perm(str,k+1,m);
swap(str[k],str[i]);
}
}
int main()
{
char str[505];
int n,i;
scanf("%d",&n);
getchar();
ans=0;
for(i=0;i<n;i++)
scanf("%c",&str[i]);
perm(str,0,n-1) ;
printf("%lld\n",ans);
return 0;
}