博客
关于我
Fire Game FZU - 2150
阅读量:526 次
发布时间: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/

    你可能感兴趣的文章
    Mysql Row_Format 参数讲解
    查看>>
    mysql select, from ,join ,on ,where groupby,having ,order by limit的执行顺序和书写顺序
    查看>>
    MySQL Server 5.5安装记录
    查看>>
    mysql server has gone away
    查看>>
    mysql skip-grant-tables_MySQL root用户忘记密码怎么办?修改密码方法:skip-grant-tables
    查看>>
    mysql slave 停了_slave 停止。求解决方法
    查看>>
    MySQL SQL 优化指南:主键、ORDER BY、GROUP BY 和 UPDATE 优化详解
    查看>>
    MYSQL sql语句针对数据记录时间范围查询的效率对比
    查看>>
    mysql sum 没返回,如果没有找到任何值,我如何在MySQL中获得SUM函数以返回'0'?
    查看>>
    mysql sysbench测试安装及命令
    查看>>
    mysql Timestamp时间隔了8小时
    查看>>
    Mysql tinyint(1)与tinyint(4)的区别
    查看>>
    MySQL Troubleshoting:Waiting on query cache mutex
    查看>>
    mysql union orderby 无效
    查看>>
    mysql v$session_Oracle 进程查看v$session
    查看>>
    mysql where中如何判断不为空
    查看>>
    MySQL Workbench 使用手册:从入门到精通
    查看>>
    MySQL Workbench 数据库建模详解:从设计到实践
    查看>>
    MySQL Workbench 数据建模全解析:从基础到实践
    查看>>
    mysql workbench6.3.5_MySQL Workbench
    查看>>