u=(x,y) 蔓延到相邻 v,则 time[v] = time[u] + burn(u),其中 burn(u)=grids[x][y]。空地 0 不可被点燃也不能继续蔓延。0 被点燃,属于多源最短路问题。
用 Dijkstra(优先队列) 从所有起火点同时出发,维护每个格子被点燃的最早时刻 dist。(a,b) 的 dist[a][b];若该点为 0 或不可达,返回 -1。要点:
你负责开发一个火灾监控预警系统,在二维网格中,每个网格可以是空地 (0) 或不同类型的可燃物( 1 到 k 的正整数,数值对应燃烧时间)。火势从初始着火点开始,蔓延规则为:可燃物被点燃后,需经过其燃烧时间才能向四周蔓延。求监控点被点燃的最早时间,若无法被点燃或监控点是空地,返回 −1 。
输入内容:
1.二维监控区域 grids,其空间 size 为 m×n(0<m<=100,0<n<=100),如 4×3 区域空间 [[0,1,2],[1,2,1],[1,1,1],[1,0,1]],0 表示空地,其余表示可燃物燃烧时间;
2.着火点坐标 fires,由多个二维坐标点组成 [x,y](0<=x<m,0<=y<n),着火点数量少于 5 ,如: [[0,0],[0,1]]
3.监控点坐标 monitor ,单个二维坐标点 [a,b](0<=a<m,0<=b<n),如: [2,2]
输入格式:
第 1 行:矩阵 size,m n,用空格分隔
第 2−m+1 行:二维矩阵内容,每行代表矩阵的一行数据,每个数据空格分隔
第 m+2 行:着火点坐标,含多个着火点,用空格分隔,0 0 2 0 表示 2 个着火点 [0,0] 与 [2,0]
第 m+3 行:监控点坐标,单个着火点,用空格分隔
输出:几分钟后火情蔓延至监控坐标 monitor ,不会着火返回 −1
输入
3 3
1 0 0
0 3 1
1 0 2
0 0 2 0
2 2
输出
-1
说明
[2,0] 坐标位置的着火点无法蔓延
[0,0] 坐标位置的着火点无法蔓延
[2,2] 坐标不会着火,返回 −1
输入
3 3
1 2 0
0 3 1
1 0 2
0 0 2 0
2 2
输出
7
说明
[2,0] 坐标位置的着火点无法蔓延
[0,0] 坐标位置的着火点 −>[0,1] 花费时间 1
−>[1,1] 花费时间 2
−>[1,2] 花费时间 3
−>[2,2] 花费时间 1
一共花费时间 7