結果
| 問題 |
No.3199 Key-Door Grid
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-07-01 17:57:32 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 1,113 ms / 3,000 ms |
| コード長 | 1,604 bytes |
| コンパイル時間 | 521 ms |
| コンパイル使用メモリ | 82,364 KB |
| 実行使用メモリ | 184,308 KB |
| 最終ジャッジ日時 | 2025-07-11 05:02:26 |
| 合計ジャッジ時間 | 16,979 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 37 |
ソースコード
import sys
from collections import deque
def solve():
H, W, M = map(int, sys.stdin.readline().split())
grid = []
start_pos, goal_pos = None, None
for r in range(H):
row = list(sys.stdin.readline().strip())
for c in range(W):
if row[c] == 'S': start_pos = (r, c)
elif row[c] == 'G': goal_pos = (r, c)
grid.append(row)
INF = float('inf')
# dist[r][c][key]: key=0は鍵なし, key=1..Mは鍵1..M
dist = [[[INF] * (M + 1) for _ in range(W)] for _ in range(H)]
q = deque()
sr, sc = start_pos
dist[sr][sc][0] = 0
q.append((sr, sc, 0)) # r, c, key
dr = [-1, 1, 0, 0]
dc = [0, 0, -1, 1]
while q:
r, c, current_key = q.popleft()
for i in range(4):
nr, nc = r + dr[i], c + dc[i]
if not (0 <= nr < H and 0 <= nc < W and grid[nr][nc] != '#'):
continue
cell = grid[nr][nc]
# 扉のチェック
if 'a' <= cell <= 'i':
required_key = ord(cell) - ord('a') + 1
if required_key != current_key:
continue
# 次の鍵の状態
next_key = current_key
if '1' <= cell <= '9':
next_key = int(cell)
if dist[r][c][current_key] + 1 < dist[nr][nc][next_key]:
dist[nr][nc][next_key] = dist[r][c][current_key] + 1
q.append((nr, nc, next_key))
gr, gc = goal_pos
ans = min(dist[gr][gc])
print(ans if ans != INF else -1)
solve()