結果

問題 No.2855 Move on Grid
ユーザー LyricalMaestro
提出日時 2025-09-07 02:10:00
言語 PyPy3
(7.3.15)
結果
AC  
実行時間 761 ms / 3,000 ms
コード長 1,890 bytes
コンパイル時間 385 ms
コンパイル使用メモリ 82,300 KB
実行使用メモリ 131,172 KB
最終ジャッジ日時 2025-09-07 02:10:26
合計ジャッジ時間 25,345 ms
ジャッジサーバーID
(参考情報)
judge4 / judge
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 40
権限があれば一括ダウンロードができます

ソースコード

diff #

## https://yukicoder.me/problems/no/2855

from collections import deque

MAX_VALUE = 10 ** 18

def solve(N, M, K, A, border):
    B = [[False] * M for _ in range(N)]
    for i in range(N):
        for j in range(M):
            if A[i][j] >= border:
                B[i][j] = True

    dist = [[MAX_VALUE for _ in range(M)] for _ in range(N)]
    passed = [[False for _ in range(M)] for _ in range(N)]
    dist[0][0] = 0 if A[0][0] >= border else 1

    queue = deque()
    queue.append((0, 0))
    while len(queue) > 0:
        i, j = queue.popleft()
        if passed[i][j]:
            continue

        passed[i][j] = True
        for di, dj in ((-1, 0), (1, 0), (0, 1), (0, -1)):
            new_i = di + i
            new_j = dj + j
            if 0 <= new_i < N and 0 <= new_j < M:
                if B[new_i][new_j]:
                    if dist[new_i][new_j] > dist[i][j]:
                        dist[new_i][new_j] = dist[i][j]
                        queue.appendleft((new_i, new_j))
                else:
                    if dist[new_i][new_j] > dist[i][j] + 1:
                        dist[new_i][new_j] = dist[i][j] + 1
                        queue.append((new_i, new_j))
    
    return dist[N - 1][M - 1] <= K


def main():
    N, M, K = map(int, input().split())

    A = []
    for _ in range(N):
        A.append(list(map(int, input().split())))
    

    values = set()
    for i in range(N):
        for j in range(M):
            values.add(A[i][j])
    values.add(10 ** 9)
    values = list(values)
    values.sort()

    low = 0
    high = len(values) - 1
    while high - low > 1:
        mid = (high + low ) // 2
        if solve(N, M, K, A, values[mid]):
            low = mid
        else:
            high = mid

    if solve(N, M, K, A, values[high]):
        print(values[high])
    else:
        print(values[low])



if __name__ == '__main__':
    main()
0