博客
关于我
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 是如何加锁的?
    查看>>
    MySQL 是怎样运行的 - InnoDB数据页结构
    查看>>
    mysql 更新子表_mysql 在update中实现子查询的方式
    查看>>
    MySQL 有什么优点?
    查看>>
    mysql 权限整理记录
    查看>>
    mysql 权限登录问题:ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES)
    查看>>
    MYSQL 查看最大连接数和修改最大连接数
    查看>>
    MySQL 查看有哪些表
    查看>>
    mysql 查看锁_阿里/美团/字节面试官必问的Mysql锁机制,你真的明白吗
    查看>>
    MySql 查询以逗号分隔的字符串的方法(正则)
    查看>>
    MySQL 查询优化:提速查询效率的13大秘籍(避免使用SELECT 、分页查询的优化、合理使用连接、子查询的优化)(上)
    查看>>
    mysql 查询数据库所有表的字段信息
    查看>>
    【Java基础】什么是面向对象?
    查看>>
    mysql 查询,正数降序排序,负数升序排序
    查看>>
    MySQL 树形结构 根据指定节点 获取其下属的所有子节点(包含路径上的枝干节点和叶子节点)...
    查看>>
    mysql 死锁 Deadlock found when trying to get lock; try restarting transaction
    查看>>
    mysql 死锁(先delete 后insert)日志分析
    查看>>
    MySQL 死锁了,怎么办?
    查看>>
    MySQL 深度分页性能急剧下降,该如何优化?
    查看>>
    MySQL 深度分页性能急剧下降,该如何优化?
    查看>>