关于元素排列的DFS
学过了关于数字的排列问题,那么推广到元素排列应该如何去做呢
例如
输入
4 aacc
输出
aacc
acac
acca
caac
caca
ccaa
6
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<cctype>
using namespace std;
int n;
long long ans;
int f[300];//由于ascll码最多到255,所以,这个计算数字出现的频率数组定义这样
int a[1000];//取值的数组dfs基本需要的
char s[1000];//字符串输入的数组
void dfs(int d)
{
int i;
if(d==n+1)
{
ans++;//输出加一
for(i=1; i<=n; i++)
printf("%c",a[i]);
printf("\n");
return ;
}
for(i=0; i<=300; i++)
{
if(f[i]>0)//前提是要频率大于0才能开始取出;
{
a[d]=i;//取出数字
f[i]--;//取出后频率减一(可类比标记的思想)
dfs(d+1);//递归下一层
f[i]++;//频率减一后下一次要用,就加一
/*类比a[d]=i;
vis[d]=1;
dfs(i+1);
vis[d]=0;
*/
}
}
}
int main()
{
while(scanf("%d%*c",&n)!=EOF)
{
ans=0;
memset(f,0,sizeof(f));
int i;
gets(s);
for(i=0; i<n; i++)
{
f[s[i]]++;计算各自频率,求和
}
dfs(1);//dfs调用
printf("%lld\n",ans);
}
return 0;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。