信息学奥赛一本通 1199:全排列 递归 dfs

全排列问题解析与实现


题目描述

给定一个由不同的小写字母组成的字符串,输出这个字符串的所有全排列。

输入要求

  • 仅一行,包含一个由不同小写字母组成的字符串。
  • 字符串长度在 1 到 6 之间(包括 1 和 6)。
  • 输入的字符串已经按照从小到大的顺序排列。

输出要求

  • 输出该字符串的所有排列方式,每行一个排列。
  • 排列需要按照字典序排列。具体来说,对于两个排列 S 和 T,如果存在某个位置 p,使得 S[1..p-1] == T[1..p-1] 且 S[p] < T[p],则 S 应排在 T 前面。

示例

输入

abc

输出

abc acb bac bca cab cba

提示

  • 禁止使用 STL(标准模板库)及其相关调用。

    解题思路

    1. 什么是全排列?

    全排列是指将一组元素的所有可能排列方式列出。例如,给定字符串 "abc",它的全排列是:

    abc, acb, bac, bca, cab, cba

    需要注意的是,题目要求输出结果按照字典序排列,因此我们需要保证生成的排列是有序的。

    2. 如何生成全排列?

    我们可以使用深度优先搜索(DFS)算法来生成所有全排列。具体步骤如下:

  • 使用一个数组 temp 来存储当前生成的排列。
  • 使用一个布尔数组 vis 来标记每个字符是否已经被使用。
  • 按照递归的方式逐层选择字符,直到生成完整的排列。
  • 当生成一个完整的排列时,将其输出。
  • 代码如下:
  • #include <iostream>
    
    using namespace std;
    
    char temp[8];
    string a;
    int len;
    bool vis[8];
    
    void dfs(int step){
    if(step==len)
    {
        for(int i=0;i<len;i++){
            cout<<temp[i];
        }
        cout<<endl;
        return;
    }
    else{
        for(int i=0;i<len;i++){
            if(vis[i]==0){
                temp[step]=a[i];
                vis[i]=1;
                dfs(step+1);
                vis[i]=0;
            }
        }
    }
    }
    int main()
    {
      cin>>a;
      len=a.length();
      dfs(0);
        return 0;
    }
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值