栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【算法】全排列(递归法)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【算法】全排列(递归法)

请编写程序输出前n个正整数的全排列(n<10),并通过9个测试用例(即n从1到9)观察n逐步增大时程序的运行时间。

输入格式:
输入给出正整数n(<10)。

输出格式:
输出1到n的全排列。每种排列占一行,数字间无空格。排列的输出顺序为字典序,即序列a
1 ,a 2​ ,⋯,a n​ 排在序列b 1​ ,b 2​ ,⋯,b n​ 之前,如果存在k使得a 1​ =b 1​ ,⋯,a k​ =b k​ 并且 a k+1

输入样例:

3

输出样例:

123
132
213
231
312
321

问题分析
递归。不能把它展开来算(千万不能深究),只能计算它的第一层,找出递归出口和特殊条件。

n个正整数的全排列,num[]= {1,2,3,4,5,6,7,8,9};
用mark[10]= {0}; 标记数字是否被选入,
int x 表示下标,设a[i]为选入的数组,
则递归出口是当x==n时,输出选入的数组a[i];

第i层计算方法:
int t=num[i];表示改层要选入的数
如果mark[t]==0,也就是这个数没有选入的时候,将数组放入a[x]数组中,
并将mark[t]=1;则此数字不能再被选入;
此后,下标x往后移,进入i+1层数字的选入;
当一次递归完成后,要释放数字,使得mark[t]=0;则下次递归时,该数字可以再被选择。

#include 
using namespace std;

int n,a[10],num[]= {1,2,3,4,5,6,7,8,9};
int mark[10]= {0}; //标记
void dp(int x)
{
    if(x==n)//递归出口
    {
        for(int i=0; i
        int t=num[i];
        if(mark[t]==0)
        {
            a[x]=t;
            mark[t]=1;
            dp(x+1);
            mark[t]=0;
        }
    }

}
int main()
{
    cin>>n;
    dp(0);
}

咱就是说,真的好难过,搞来搞去又看不懂,每天当一个又笨又懒的码农,如果只是为了考试而学习真没意思/
如果不好好读书的话,当不了齐天大圣,只能回家种地了。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/947384.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号