思路
這題可以用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)