關於元素排列的DFS

Maosghoul發表於2019-05-10

關於元素排列的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;
}

相關文章