dfs大楼之洛谷1691

题目描述

设R={r1,r2,……,rn}是要进行排列的n个元素。其中元素r1,r2,……,rn可能相同。使设计一个算法,列出R的所有不同排列。

给定n以及待排列的n个元素。计算出这n个元素的所有不同排列。

输入输出格式

输入格式:

第1行:元素个数n(1<=n<500)

第2行:一行字符串,待排列的n个元素

输出格式:

计算出的n个元素的所有不同排列,最后一行是排列总数。

输入输出样例

输入样例#1:  复制
4
aacc
输出样例#1:  复制
aacc
acac
acca
caac
caca
ccaa
6






说明

输出按字典顺序排


显然,这是一道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;

}

因为自己先尝试过用字符串来实现,但是失败了,所以采用字符数组

其实我觉得用字符串是可以的,但是暂时没想到怎么去写,容我再思考一番。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值