提交数: 1080, 通过率: 42.13%, 平均分: 61.8
题目描述:
设R={ r1, r2 , …, rn}是要进行排列的n个元素。其中元素r1, r2 , …, rn均为小写字母并且可能相同。试设计一个算法,列出R的所有不同排列。
给定n 以及待排列的n 个元素。计算出这n 个元素的所有不同排列。
输入格式:
第1 行是元素个数n,1≤n≤500。接下来的1 行是待排列的n个元素。
输出格式:
计算出的n个元素的所有不同排列
最后1行中的数是排列总数
样例输入:
4 aacc
样例输出:
aacc acac acca caac caca ccaa 6
提示:
满足条件排列6个,如下:aacc acac acca caac caca ccaa
超时的同学把输出改一下,不要用cout。
比如putchar(a) 输出变量a
putchar('\n')输出换行
代码实现:、
//dfs
#include<bits/stdc++.h>
using namespace std;
int n,a[256],k,ans;
char c,cmax='a',used[100001],cmin='z';
void dfs(int t){
if(t>n){
for(int i=1;i<=n;i++)cout<<used[i];
cout<<"\n";
ans++;
return;
}
for(int i=cmin;i<=cmax;i++){
if(a[i]){
a[i]--;
used[t]=i;
dfs(t+1);
a[i]++;
}
}
}
int main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++){
cin>>c;
cmax=max(cmax,c);
cmin=min(cmin,c);
a[c]++;
}
dfs(1);
cout<<ans;
return 0;
}