大家好啊,今天是我使用豆包MarsCode AI刷题的第三天,今天我给大家讲解的题目是小M的光明之魂速通挑战。老样子,咱们先看题目。
一、题目描述
题目描述了小 M 参加《光明之魂》速通比赛的情况。比赛中,玩家有 N 把武器,需要按顺序击败 M 个 Boss。每个 Boss 有唯一的类型编号,每把武器只能使用一次且能击败两种类型的 Boss。小 M 想知道在不违反规则的前提下,他最多能击败多少个 Boss。
题目中还对输入变量进行了说明:n 表示武器数量,m 表示 Boss 数量,boss 是长度为 m 的列表,表示玩家必须按顺序击杀的 Boss 类型,array 是长度为 n 的二维列表,表示对应的武器可以击败的 Boss 类型。
二、解题思路
针对这道题,我的想法是可以通过循环来依次检查每把武器与当前需要击败的 Boss 是否匹配。从第一个 Boss 开始,对于每一个 Boss,遍历所有的武器。当遍历到某把武器时,检查该武器可击败的两种 Boss 类型是否包含当前要击败的这个 Boss 的类型。如果包含,就意味着这把武器可以用来击败当前 Boss,此时记录下这个匹配情况并继续往后检查下一个 Boss(同时标记该武器已使用,后续不再考虑这把武器用于其他 Boss)。那么遍历的话就可以采用深度优先搜索,因为深度优先搜索(DFS)适用于这个问题,它可以系统地探索所有可能的武器使用组合,确保在每个Boss上尝试所有未使用的武器,从而找到最大击杀数。当然遇事不决,还可以请教一下豆包MarsCode,它的回答如下:
简直跟我如出一辙,这是不是代表我有长进了呢····
三、代码解析
说实话,代码方面我一直比较薄弱,究其原因还是因为自己敲代码敲少了,所以这活还得请豆包MarsCode出山:
解释一下代码:
-
solution函数- 这是主函数,接受四个参数:
n(武器数量)、m(Boss 数量)、boss(Boss 类型列表)和array(武器能击败的 Boss 类型二维列表)。 - 首先,初始化一个长度为
n的布尔列表used,所有元素初始化为False,表示所有武器都还未被使用。 - 然后,调用
dfs函数并传入boss、array、used和初始索引0,开始深度优先搜索(DFS)来计算最多能击杀的 Boss 数量。
- 这是主函数,接受四个参数:
-
dfs函数-
这是一个递归函数,用于深度优先搜索。
-
当
index等于boss列表的长度时,表示所有 Boss 都已经处理完毕,返回 0。 -
在
dfs函数外部,初始化一个变量max_kill为 0,用于记录最多能击杀的 Boss 数量。 -
对于每一把武器(索引
i在0到len(array) - 1之间),检查以下条件:- 如果武器
i还未被使用(not used[i]),并且武器i能击败当前 Boss(array[i][0] == boss[index]或array[i][1] == boss[index])。 - 如果满足条件,标记武器
i为已使用(used[i] = True),然后递归调用dfs函数处理下一个 Boss(index + 1),并将返回的击杀数量加 1(kills = 1 + dfs(boss, array, used, index + 1))。 - 递归调用完成后,恢复武器
i的使用状态(used[i] = False),以便在其他路径中可以再次使用这把武器。
- 如果武器
-
如果
kills大于max_kill,则更新max_kill的值。 -
最后,返回
max_kill,即最多能击杀的 Boss 数量。
-
四、自我总结
之前做得少,通过这道题还是深入理解了如何通过深度优先搜索算法,结合条件判断与状态标记回溯,穷举所有可能组合。再接再厉吧。