题目描述
设R={r1,r2,……,rn}是要进行排列的n个元素。其中元素r1,r2,……,rn可能相同。使设计一个算法,列出R的所有不同排列。
给定n以及待排列的n个元素。计算出这n个元素的所有不同排列。
输入输出格式
输入格式:
第1行:元素个数n(1<=n<500)
第2行:一行字符串,待排列的n个元素
输出格式:
计算出的n个元素的所有不同排列,最后一行是排列总数。
输入输出样例
输入样例#1:
4 aacc
输出样例#1:
aacc acac acca caac caca ccaa 6
说明
输出按字典顺序排
深搜版:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstdlib>
using namespace std;
char ch[1001],arr[1001];
int n,b[27],s;
void dfs(int i)
{
for(int j=1;j<=26;j++)
{
if(b[j]>0)
{
arr[i]=j-1+'a';
b[j]--;
if(i==n)
{
s++;
for(int k=1;k<=n;k++)
cout<<arr[k];
cout<<endl;
}
else
dfs(i+1);
b[j]++;
}
}
}
int main()
{
scanf("%d",&n);
cin>>ch;
for(int i=0;i<n;i++)
b[ch[i]-'a'+1]++;
dfs(1);
printf("%d",s);
return 0;
}
函数版:
先普及一下知识:
https://blog.csdn.net/ac_gibson/article/details/45308645
#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;
char a[999];
int main()
{
int n,s=0;
scanf("%d\n",&n);
gets(a);
while(next_permutation(a,a+n));/*64ms
如果替换成
sort(a,a+1);
32ms;*/
do
{
puts(a);
s++;
}while(next_permutation(a,a+n));
printf("%d",s);
return 0;
}