結果
| 問題 | No.3199 Key-Door Grid |
| コンテスト | |
| ユーザー |
dp_ijk
|
| 提出日時 | 2025-07-11 22:46:39 |
| 言語 | PyPy3 (7.3.17) |
| 結果 |
AC
|
| 実行時間 | 778 ms / 3,000 ms |
| + 542µs | |
| コード長 | 1,643 bytes |
| 記録 | |
| コンパイル時間 | 242 ms |
| コンパイル使用メモリ | 95,596 KB |
| 実行使用メモリ | 157,696 KB |
| 最終ジャッジ日時 | 2026-07-13 04:04:37 |
| 合計ジャッジ時間 | 14,560 ms |
|
ジャッジサーバーID (参考情報) |
judge2_0 / judge3_1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 37 |
ソースコード
from string import ascii_lowercase as abc
abc = "*"+abc
def solve(H, W, M, grid):
dp = full((M+1, H, W), INF)
def get(ch):
for i in range(H):
for j in range(W):
if grid[i][j] == ch:
return i, j
assert False
si, sj = get("S")
ti, tj = get("G")
grid[si] = grid[si].replace("S", ".")
grid[ti] = grid[ti].replace("G", ".")
dp[0][si][sj] = 0
from collections import deque
Q = deque([(0, si, sj)])
def relax(nm, ni, nj, dist):
ndist = dist + 1
if dp[nm][ni][nj] <= ndist: return
dp[nm][ni][nj] = ndist
Q.append((nm, ni, nj))
while Q:
m, i, j = Q.popleft()
dist = dp[m][i][j]
for di, dj in DIR4:
ni, nj = i+di, j+dj
if not (0 <= ni < H and 0 <= nj < W): continue
nch = grid[ni][nj]
if nch == "*": continue
if "a" <= nch <= "z":
id = ord(nch) - ord("a") + 1
if id == m:
relax(m, ni, nj, dist)
if "1" <= nch <= "9":
nm = int(nch)
relax(nm, ni, nj, dist)
if nch == ".":
relax(m, ni, nj, dist)
res = min(dp[m][ti][tj] for m in range(M+1))
if res == INF:
return -1
return res
DIR4 = [(1, 0), (0, 1), (-1, 0), (0, -1)]
import typing
INF = typing.cast(int, float("INF"))
def full(shape: tuple[int, ...], fill_value):
assert len(shape) >= 1
if len(shape) == 1: return [fill_value] * shape[0]
return [full(shape[1:], fill_value) for _ in range(shape[0])]
H, W, M = map(int, input().split())
grid = [input() for _ in range(H)]
ans = solve(H, W, M, grid)
print(ans)
dp_ijk