全排列问题

这又是本蒟蒻再学习完全排列后写出的博客(手动狗头

洛谷题目传送门(P1706 全排列问题)

这个问题很简单,就是给出一个数列,求这个数列有多少种排列方法(最简单的排列组合种的排列)。
那要实现这个问题,肯定会在脑子中想到两种方法:万能的STL大法和手写DFS


开局一条分割线,就问你服不服?(滑稽

关于STL,我们需要知道在<algorithm>头文件中有这样一个神奇的东西:next_permutation函数。
这个函数的原型可以理解为bool next_permutation(begin,end);,其中begin是这个数组第一个数的下标,end是这个数组种最后一个数的下标。
这个函数就可以直接把我们输入的数组以全排列的形式输出出来,代码如下:

do{
    for (int i=1;i<=n;i++){
        printf("%5d",a[i]); // 输出a数组,宽度设置为5
    }
    puts("");
} while (next_permutation(a+1,a+1+n)); // 函数原型

当然,因为是STL大法,所以在时间和空间上会有所妥协。因此,生成next_permutation函数的时间复杂度为O(n),一共有O(n!)个排列,总的时间复杂度可能为O(n*n!)。对于给出的例题,这个复杂度是完全可以接受的,但是对于其他题目可能需要设计合理的剪枝算法才可行。
下一步,我们就考虑手写搜索函数实现全排列。


开局又一条分割线,就问你服不服?(orz滑稽
posted @ 2021-12-27 21:33  煎饼Li  阅读(26)  评论(0编辑  收藏  举报