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

【算法】全排列(递归法),第1张

请编写程序输出前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<n; i++)
            cout<<a[i];
        cout<<endl;
        return ;
    }
    for(int i=0; i<n; 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);
}

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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1324281.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-12
下一篇 2022-06-12

发表评论

登录后才能评论

评论列表(0条)