关于元素排列的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;
}

Maosghoul
2 声望3 粉丝