【C++】2023.2.7打卡第六天_17

三百题蓝桥省一战神 2023-02-07 20:29:10

递归实现排列枚举II

题目描述

给定一个长度为 n的可包含重复数字的序列,请你求出其所有不重复的全排列。

输入格式

第一行包含整数 n。

第二行包含 n 个整数。

输出格式

输出所有的不同排列,每种排列占一行。

在确定每种排列的输出顺序时,第一个数较小的先输出,第一个数相同时,第二个数较小的先输出,以此类推。

数据范围

1≤n≤9,
数组中包含的元素的取值范围 [1,9]

输入样例:

3
1 1 2

输出样例:

1 1 2
1 2 1
2 1 1

我的解答

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>

using namespace std;

int a[10];
bool vis[10];
int b[10];
int n;

void dfs(int step)
{
    //递归出口
    if(step==n)
    {
        for(int i=0;i<n;i++) cout<<b[i]<<" ";
        cout<<endl;
        return ;
    }
    //递归条件
    for(int i=0;i<n;i++)
    {
        if(vis[i]==false)
        {
            vis[i]=true;
            b[step]=a[i];
            dfs(step+1);
            vis[i]=false;   //回溯
            while(i+1<n&&a[i+1]==a[i]) i++;  //回溯后对下一个结点进行限制
        }
    }
}
int main()
{
    cin>>n;
    for(int i=0;i<n;i++)     cin>>a[i];
    sort(a,a+n);  //排序后方便去重
    dfs(0);
    return 0;
}

总结

1.while的作用:在全排列的基础上,对重复分支去重

 

2.在套dfs模板之前,先分析清楚整个过程,再灵活对条件修改。

...全文
8 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

30,230

社区成员

发帖
与我相关
我的任务
社区描述
打造最热爱学习的高校社区,帮助大家提升计算机领域知识,带大家打比赛拿奖,提高自我,希望大家共同创造良好的社区氛围。
社区管理员
  • 川川菜鸟
  • 亡心灵
  • 星辰菜鸟
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

监督大家学习,每日学习打卡,以投稿形式打卡。扫码关注公众号,可加入粉丝群和领取大量资源。

试试用AI创作助手写篇文章吧