結果
| 問題 |
No.2855 Move on Grid
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 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 |
ソースコード
## 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()