【DFS深度优先搜索】纵火犯

【问题描述】

        给你一块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. 遍历整个草坪:你可以从矩阵中的任意一个点开始,找到所有为1(代表草坪)的起点。

  2. 使用DFS搜索连通区域:当找到一个草坪点(值为1)时,使用DFS递归地搜索它的上下左右四个方向,寻找所有连接在一起的草坪。对于已经访问过的点,标记为已访问(或者直接修改矩阵值为0),避免重复计算。

  3. 计算连通块的大小:每次执行DFS时,记录连通块的大小(即能烧掉的草坪数量)。

  4. 更新最大值:遍历所有可能的起点,找到最大的连通块大小,即为一次点火能烧掉的最多草坪数。

【题解】

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值