三国势力划分问题| 豆包MarsCode AI 刷题

58 阅读2分钟

问题描述

小C在一个大小为 n * m 的棋盘状土地上发现了三个国家的势力分布s。每个格子上都有一个数字,表示该格子的归属国家。上下左右相邻且属于同一个国家的格子被认为是同一股势力。现在小C想知道,这片土地上总共有多少股不同的势力。

你需要编写一个程序来计算土地上总共的势力股数。

问题理解

你需要在一个 n * m 的棋盘上计算不同势力的数量。每个格子上的数字表示该格子属于哪个国家。如果两个相邻的格子(上下左右)属于同一个国家,它们被认为是同一股势力。

数据结构选择

  1. 二维数组:我们可以使用一个二维数组来表示棋盘,其中每个元素表示该格子所属的国家。
  2. 访问标记:为了防止重复计算同一股势力,我们可以使用一个二维数组来标记哪些格子已经被访问过。

算法步骤

  1. 初始化:创建一个二维数组 visited 来记录每个格子是否被访问过,初始值为 False
  2. 遍历棋盘:从左上角开始遍历每个格子。
  3. DFS/BFS:对于每个未访问的格子,使用深度优先搜索(DFS)或广度优先搜索(BFS)来标记与该格子属于同一股势力的所有格子,并将它们标记为已访问。
  4. 计数:每次启动 DFS/BFS 时,计数器加一,表示发现了一股新的势力。
  5. 返回结果:遍历结束后,计数器的值即为不同势力的数量。

代码提示

  1. 将字符串列表转换为二维数组

1732805917140.png

  1. 初始化访问标记数组

1732806102758.png

  1. DFS 函数

1732806128456.png

  1. 遍历棋盘并启动 DFS

1732806163979.png

完整代码框架

1732806223790.png 1732806270350.png

关键步骤解释

  1. 将字符串列表转换为二维数组grid = [list(row) for row in s]
  2. 初始化访问标记数组visited = [[False] * m for _ in range(n)]
  3. DFS 函数dfs(x, y, country) 用于递归标记同一势力的所有格子。
  4. 遍历棋盘for i in range(n): for j in range(m): 用于查找未访问的格子并启动 DFS。
  5. 计数器count += 1 每次启动 DFS 时计数器加一。

总结

通过使用 DFS 或 BFS 来遍历棋盘,并使用一个访问标记数组来避免重复计算,你可以有效地计算出棋盘上不同势力的数量。