题目
题目描述
奶牛 B e s s i e Bessie Bessie 计划好好享受柔软的春季新草。新草分布在 R R R 行 C C C 列的牧场里。它想计算一下牧场中的草丛数量。
在牧场地图中,每个草丛要么是单个#
,要么是有公共边的相邻两个#
。给定牧场地图,计算有多少个草丛。
例如,考虑如下 5 5 5 行 6 6 6 列的牧场地图
.#....
..#...
..#..#
...##.
.#....
这个牧场有 5 5 5 个草丛:一个在第一行,一个在第二列横跨了二、三行,一个在第三行,一个在第四行横跨了四、五列,最后一个在第五行。
输入格式
第一行包含两个整数 R R R 和 C C C,中间用单个空格隔开。( 1 ≤ R , C ≤ 100 1≤R,C≤100 1≤R,C≤100)
接下来
R
R
R 行,每行
C
C
C 个字符,描述牧场地图。字符只有#
或.
两种。
输出格式
输出一个整数,表示草丛数。
样例输入
5 6
.#....
..#...
..#..#
...##.
.#....
样例输出
5
解题
思路分析
- 本题主要用到深度优先搜索(Depth-First-Search)算法
- 首先用二维数组生成牧场地图
- 此处
Python
应注意每行用list
将将字符串分割成字符型列表,因为Python的字符串无法直接修改字符
- 此处
- 遍历牧场,按条件进入深搜(
ls[i][j] == '#'
)- 每次进入次数+1(包括相连的视为一片草)
- 每深搜到一个符合条件的字符,就将其变成一个
.
,然后判断其右侧或下边是否还有相连的#
- 如果有,继续对相连的草地执行第三步操作操作。
dfs代码
def dfs(x, y):
ls[x][y] = '.'
if x != m - 1 and ls[x + 1][y] == '#':
dfs(x + 1, y)
if y != n - 1 and ls[x][y + 1] == '#':
dfs(x, y + 1)
完整代码实现
ls = []
m, n = map(int, input().split())
for i in range(m):
ls.append(list(input()))
c = 0
def dfs(x, y):
ls[x][y] = '.'
if x != m - 1 and ls[x + 1][y] == '#':
dfs(x + 1, y)
if y != n - 1 and ls[x][y + 1] == '#':
dfs(x, y + 1)
for i in range(m):
for j in range(n):
if ls[i][j] == '#':
dfs(i, j)
c += 1
print(c)