博客
关于我
Fire Game FZU - 2150
阅读量:520 次
发布时间:2019-03-08

本文共 2763 字,大约阅读时间需要 9 分钟。

为了解决这个问题,我们需要找到两个起点,使得从这两个起点同时点燃的火焰能够在最短的时间内烧掉所有的草。火焰可以水平、垂直相邻的四个方向扩散。我们需要计算这种情况下的最小时间,如果无法完全烧掉所有的草,则返回-1。

方法思路

  • 问题分析:火焰从两个点同时开始,四个方向扩散。我们需要找到最小的时间,使得所有的草都被烧掉。
  • 广度优先搜索(BFS):使用BFS来计算从两个起点同时开始的火焰扩散的时间。BFS适合处理这种层层扩散的问题。
  • 起点对遍历:遍历所有可能的起点对,包括同一个点。对于每个起点对,进行BFS,记录每个点的被烧时间,并检查是否覆盖了所有的草。如果有任何一个草未被烧到,则跳过这种起点对。
  • 最小时间计算:对于每个满足条件的起点对,记录最大的被烧时间,并找出所有起点对中的最小值。
  • 解决代码

    import sysfrom collections import dequedef solve():    T = int(sys.stdin.readline())    for case in range(1, T + 1):        N, M = map(int, sys.stdin.readline().split())        grid = []        for _ in range(N):            row = sys.stdin.readline().strip()            grid.append(row)        # 收集所有'#'的位置        cells = []        for i in range(N):            for j in range(M):                if grid[i][j] == '#':                    cells.append((i, j))        num_cells = len(cells)        if num_cells == 0:            print(-1)            continue        if num_cells == 1:            print(0)            continue        # 初始化最小时间为一个很大的值        min_time = float('inf')        # 遍历所有可能的起点对        for i1, j1 in cells:            for i2, j2 in cells:                # 创建一个距离矩阵,初始化为-1                distance = [[-1 for _ in range(M)] for _ in range(N)]                # 初始化队列,同时加入两个起点                queue = deque()                queue.append((i1, j1))                distance[i1][j1] = 0                queue.append((i2, j2))                distance[i2][j2] = 0                # BFS开始                while queue:                    x, y = queue.popleft()                    # 四个方向                    for dx, dy in [(-1, 0), (1, 0), (0, -1), (0, 1)]:                        nx = x + dx                        ny = y + dy                        if 0 <= nx < N and 0 <= ny < M:                            if distance[nx][ny] == -1 and grid[nx][ny] == '#':                                distance[nx][ny] = distance[x][y] + 1                                queue.append((nx, ny))                # 检查是否覆盖所有细胞                all_covered = True                max_dist = 0                for (a, b) in cells:                    if distance[a][b] == -1:                        all_covered = False                        break                    if distance[a][b] > max_dist:                        max_dist = distance[a][b]                if all_covered:                    if max_dist < min_time:                        min_time = max_dist        if min_time != float('inf'):            print(min_time)        else:            print(-1)if __name__ == "__main__":    solve()

    代码解释

  • 读取输入:读取输入的测试用例数和每个测试用例的网格。
  • 收集草的位置:遍历网格,收集所有草的位置。
  • 特殊情况处理:如果只有一个草,直接输出0。
  • 遍历起点对:对于每对可能的起点,进行BFS计算火焰扩散时间。
  • BFS处理:使用队列处理每个点的扩散,记录每个点的被烧时间。
  • 检查覆盖情况:检查是否覆盖了所有的草,如果覆盖,记录最大的被烧时间,并更新最小时间。
  • 输出结果:根据最小时间输出结果,否则输出-1。
  • 通过这种方法,我们可以高效地解决问题,确保在最短的时间内找到最优解。

    转载地址:http://emziz.baihongyu.com/

    你可能感兴趣的文章
    SkyWalking性能剖析
    查看>>
    JavaScript——原生
    查看>>
    vue动态组件与插件到底是什么?
    查看>>
    还不知道做什么项目的看这里,【总结全网】Python入门实战项目
    查看>>
    【2021.5.8 NOI模拟】贪心
    查看>>
    python3下安装jupyter kernel报错问题
    查看>>
    计算机网络参考模型,图文详解,更懂你!
    查看>>
    mybatis 简单学习
    查看>>
    操作系统学科复习图
    查看>>
    P1226 【模板】快速幂||取余运算
    查看>>
    机器学习分类算法模型评价指标
    查看>>
    LeetCode197.打家劫舍
    查看>>
    pandas(10):数据增删改
    查看>>
    第7周编程作业
    查看>>
    Codeforces Round #426 (Div. 2) The Useless Toy
    查看>>
    A simple problem HDU-2522 【数学技巧】
    查看>>
    487-3279 POJ-1022【前导0~思维漏洞】
    查看>>
    D. Timofey and rectangles[四色定理]
    查看>>
    小Z的袜子(hose) HYSBZ - 2038 [莫队算法]
    查看>>
    Problem C. Dynamic Graph Matching [状态压缩DP]
    查看>>