關於元素排列的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("
");
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
",ans);
}
return 0;
}