题目描述
设R={r1,r2,……,rn}是要进行排列的n个元素。其中元素r1,r2,……,rn可能相同。使设计一个算法,列出R的所有不同排列。
给定n以及待排列的n个元素。计算出这n个元素的所有不同排列。
输入输出格式
输入格式:第1行:元素个数n(1<=n<500)
第2行:一行字符串,待排列的n个元素
输出格式:计算出的n个元素的所有不同排列,最后一行是排列总数。
输入输出样例
说明
输出按字典顺序排
显然,这是一道dfs的题目,不过不是简单的dfs,而是用字符的;
于是想到用字符数组来代替普通的数组;
然后题目说会有重复的字母;
于是想到用没个字母出现的次数来记录当前状态,每次遇到,就减一,回溯时再加回来;
下面是我自己敲的代码:
#include<iostream>
#include<cstdio>using namespace std;
int n;
int b[26];
char ss[1000];
int counts=0;
void dfs(int x)
{
if(x>=n)
{
for(int i=0;i<=n-1;i++)
{
cout<<ss[i];
}
cout<<endl;
counts++;
}
else
{
for(int i=0;i<=25;i++)
if(b[i]!=0)
{
b[i]--;
ss[x]=i+'a';
dfs(x+1);
b[i]++;
}
}
}
string s;
int main()
{
cin>>n;
cin>>s;
for(int i=0;i<s.size();i++)
{
b[s[i]-'a']++;
}
dfs(0);
cout<<counts;
return 0;
}
因为自己先尝试过用字符串来实现,但是失败了,所以采用字符数组
其实我觉得用字符串是可以的,但是暂时没想到怎么去写,容我再思考一番。