小M的光明之魂速通挑战 | 豆包MarsCode AI刷题

152 阅读3分钟

大家好啊,今天是我使用豆包MarsCode AI刷题的第三天,今天我给大家讲解的题目是小M的光明之魂速通挑战。老样子,咱们先看题目。

一、题目描述

题目描述了小 M 参加《光明之魂》速通比赛的情况。比赛中,玩家有 N 把武器,需要按顺序击败 M 个 Boss。每个 Boss 有唯一的类型编号,每把武器只能使用一次且能击败两种类型的 Boss。小 M 想知道在不违反规则的前提下,他最多能击败多少个 Boss。
题目中还对输入变量进行了说明:n 表示武器数量,m 表示 Boss 数量,boss 是长度为 m 的列表,表示玩家必须按顺序击杀的 Boss 类型,array 是长度为 n 的二维列表,表示对应的武器可以击败的 Boss 类型。

image.png

二、解题思路

针对这道题,我的想法是可以通过循环来依次检查每把武器与当前需要击败的 Boss 是否匹配。从第一个 Boss 开始,对于每一个 Boss,遍历所有的武器。当遍历到某把武器时,检查该武器可击败的两种 Boss 类型是否包含当前要击败的这个 Boss 的类型。如果包含,就意味着这把武器可以用来击败当前 Boss,此时记录下这个匹配情况并继续往后检查下一个 Boss(同时标记该武器已使用,后续不再考虑这把武器用于其他 Boss)。那么遍历的话就可以采用深度优先搜索,因为深度优先搜索(DFS)适用于这个问题,它可以系统地探索所有可能的武器使用组合,确保在每个Boss上尝试所有未使用的武器,从而找到最大击杀数。当然遇事不决,还可以请教一下豆包MarsCode,它的回答如下:

image.png 简直跟我如出一辙,这是不是代表我有长进了呢····

三、代码解析

说实话,代码方面我一直比较薄弱,究其原因还是因为自己敲代码敲少了,所以这活还得请豆包MarsCode出山:

image.png 解释一下代码:

  1. solution函数

    • 这是主函数,接受四个参数:n(武器数量)、m(Boss 数量)、boss(Boss 类型列表)和array(武器能击败的 Boss 类型二维列表)。
    • 首先,初始化一个长度为n的布尔列表used,所有元素初始化为False,表示所有武器都还未被使用。
    • 然后,调用dfs函数并传入bossarrayused和初始索引0,开始深度优先搜索(DFS)来计算最多能击杀的 Boss 数量。
  2. dfs函数

    • 这是一个递归函数,用于深度优先搜索。

    • index等于boss列表的长度时,表示所有 Boss 都已经处理完毕,返回 0。

    • dfs函数外部,初始化一个变量max_kill为 0,用于记录最多能击杀的 Boss 数量。

    • 对于每一把武器(索引i0len(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 数量。

四、自我总结

之前做得少,通过这道题还是深入理解了如何通过深度优先搜索算法,结合条件判断与状态标记回溯,穷举所有可能组合。再接再厉吧。