B3623 枚举排列 題解

· · 题解

B3623 枚举排列 題解

如果您做完了此题,您可以尝试:

B3621 枚举元组

B3622 枚举子集

B3624 猫粮规划

题目大概的意思就是从 n 个人中选出 k 人排列,输出所有的排列方案。

这和枚举元组和枚举子集不一样的是,一个人在一个方案中只能出现一次。

方法1: 枚举所有方案后排除非法方案。

我们可以直接枚举 k 元组,然后将非法的方案剔除。

时间复杂度为 O(n^k),无法胜任此题。

所以我们要想其他的方法。

方法2: 使用一种方法判断该数是否使用过。

我们可以用 use 数组判断数字 i 是否被使用过,如果使用过标记位 1。

i 1 2 3 4 5
a_i 1 2 ?
i 1 2 3 4 5
use_i 1 1 0 0 0

在这个例子中,数字 1 和 2 已经被使用,所以对应的 use 数组中全部标记 1,下次枚举是遇到 1 就可以直接跳过。

可以写一个 dfs 函数来完成此题。

这就是我们的 dfs 函数。

管理员注:

由于课程需要本题不展示代码。

如需系统学习相关知识点请报名【洛谷-基础算法计划】