问题描述
小C在一个大小为 n * m 的棋盘状土地上发现了三个国家的势力分布s。每个格子上都有一个数字,表示该格子的归属国家。上下左右相邻且属于同一个国家的格子被认为是同一股势力。现在小C想知道,这片土地上总共有多少股不同的势力。
你需要编写一个程序来计算土地上总共的势力股数。
问题理解
你需要在一个 n * m 的棋盘上计算不同势力的数量。每个格子上的数字表示该格子属于哪个国家。如果两个相邻的格子(上下左右)属于同一个国家,它们被认为是同一股势力。
数据结构选择
- 二维数组:我们可以使用一个二维数组来表示棋盘,其中每个元素表示该格子所属的国家。
- 访问标记:为了防止重复计算同一股势力,我们可以使用一个二维数组来标记哪些格子已经被访问过。
算法步骤
- 初始化:创建一个二维数组
visited来记录每个格子是否被访问过,初始值为False。 - 遍历棋盘:从左上角开始遍历每个格子。
- DFS/BFS:对于每个未访问的格子,使用深度优先搜索(DFS)或广度优先搜索(BFS)来标记与该格子属于同一股势力的所有格子,并将它们标记为已访问。
- 计数:每次启动 DFS/BFS 时,计数器加一,表示发现了一股新的势力。
- 返回结果:遍历结束后,计数器的值即为不同势力的数量。
代码提示
- 将字符串列表转换为二维数组:
- 初始化访问标记数组:
- DFS 函数:
- 遍历棋盘并启动 DFS:
完整代码框架
关键步骤解释
- 将字符串列表转换为二维数组:
grid = [list(row) for row in s] - 初始化访问标记数组:
visited = [[False] * m for _ in range(n)] - DFS 函数:
dfs(x, y, country)用于递归标记同一势力的所有格子。 - 遍历棋盘:
for i in range(n): for j in range(m):用于查找未访问的格子并启动 DFS。 - 计数器:
count += 1每次启动 DFS 时计数器加一。
总结
通过使用 DFS 或 BFS 来遍历棋盘,并使用一个访问标记数组来避免重复计算,你可以有效地计算出棋盘上不同势力的数量。