Zerojudge j125. 蓋步道

題解

用二分搜尋法搜尋答案,每次搜尋都跑一個BFS。n最大才300,所以不會TLE。

Python 解答

from collections import deque

directions = [(0, 1), (1, 0), (0, -1), (-1, 0)]

def bfs(n, a, k):
    INF = float('inf')
    mat = [[INF] * n for _ in range(n)]
    mat[0][0] = 0
    que = deque([(0, 0)])
    while que:
        i, j = que.popleft()
        for di, dj in directions:
            ni, nj = i + di, j + dj
            if 0<=ni<n and 0<=nj<n and abs(a[i][j]-a[ni][nj])<=k and mat[ni][nj]==INF:
                mat[ni][nj] = mat[i][j]+1
                que.append((ni, nj))
                
    return mat[n-1][n-1]

def binary(n, a):
    l, r = -1, 1000000
    while r - l > 1:
        mid = (l+r) // 2
        if bfs(n, a, mid) < float('inf'):
            r = mid
        else:
            l = mid
    return r, bfs(n, a, r)

n = int(input())
a = []
for i in range(n):
    row = list(map(int, input().split()))
    a.append(row)

k, steps = binary(n, a)
print(k)
print(steps)