【问题描述】
给你一块n*m的草坪,问如果只点一次火,最多能烧多少块草坪。可以从n*m的草地中任意一个地方开始点火,火只能往上下左右传递,没有草的地方不能燃烧。
【输入格式】
输入由多个测试例组成。每个测试例的第一行含两个整数n和m, (1 <=n,m<=100), 分别表示01矩阵的行数与列数,
后面紧跟着n行,每行含m个整数0或1,1代表草坪,0表示啥也没有,相邻两个整数之间用一个空格隔开,两个测
试例之间用一个空行隔开,最后一个测试例之后隔一个空行,最后一行含有两个整数0,表示输入结束。
【输出格式】
每个测试例对应一行输出,含一个整数,表示只点一次火最多能烧的草坪个数。
【样例输入】
5 6
0 1 1 0 0 1
1 1 0 1 0 1
0 1 0 0 1 0
0 0 0 1 1 1
1 0 1 1 1 0
0 0
【样例输出】
7
【解题思路】
-
遍历整个草坪:你可以从矩阵中的任意一个点开始,找到所有为1(代表草坪)的起点。
-
使用DFS搜索连通区域:当找到一个草坪点(值为1)时,使用DFS递归地搜索它的上下左右四个方向,寻找所有连接在一起的草坪。对于已经访问过的点,标记为已访问(或者直接修改矩阵值为0),避免重复计算。
-
计算连通块的大小:每次执行DFS时,记录连通块的大小(即能烧掉的草坪数量)。
-
更新最大值:遍历所有可能的起点,找到最大的连通块大小,即为一次点火能烧掉的最多草坪数。
【题解】
def dfs(grid, x, y, n, m):
if x < 0 or y < 0 or x >= n or y >= m or grid[x][y] == 0:
return 0
grid[x][y] = 0
size = 1
size += dfs(grid, x + 1, y, n, m)
size += dfs(grid, x - 1, y, n, m)
size += dfs(grid, x, y + 1, n, m)
size += dfs(grid, x, y - 1, n, m)
return size
def max_area(n, m, grid):
max_ = 0
for i in range(n):
for j in range(m):
if grid[i][j] == 1:
max_ = max(max_, dfs(grid, i, j, n, m))
return max_
if __name__ == '__main__':
while True:
n, m = map(int, input().split())
if n == 0 and m == 0:
break
grid = []
for _ in range(n+1):
grid.append(list(map(int, input().split())))
result = max_area(n, m, grid)
print(result)
标签:__,优先,max,DFS,纵火犯,草坪,grid,dfs,size
From: https://blog.csdn.net/2301_80582866/article/details/142337978