思路
这题可以用BFS
做,也可以用二分
来做。
用二分这里只提供一个思路:对时间来二分查找,check函数就是检查在特定的时间 t 0 t_0 t0内每一个暖气炉的传播距离能否覆盖所有格子。
用BFS做:
由几个点开始向外扩散,知道铺满整个面。可以用BFS来做,原本的BFS是从一个点开始加入deque
,多源BFS那现在就先把所有的暖气炉加入deque
,再遍历就行了。
还有一个注意点,题目的输出是花了多少时间,也就是扩散的轮数
,我们可以用距离
来度量时间
,一秒钟一格,所以我们时刻更新所出现的距离暖气炉最远的距离即可。我们把vis
标记数组替换为dis
数组 兼具判断是否遍历和记录距离的作用。
code
import os
import sys
from collections import dequen,m,t = map(int,input().split())
q = deque()
dis = [[-1 for i in range(m+1)] for j in range(n+1)]
for i in range(t):x,y = map(int,input().split())q.append([x,y])dis[x][y] = 0ans = 0
while len(q)!=0:x,y = q.popleft()for dx,dy in [(-1,0),(+1,0),(0,-1),(0,+1),(-1,-1),(-1,+1),(+1,-1),(+1,+1)]:nx,ny = x+dx,y+dyif 1<=nx<=n and 1<=ny<=m:if dis[nx][ny]==-1:q.append([nx,ny])dis[nx][ny] = dis[x][y] + 1ans = max(ans,dis[nx][ny])print(ans)