結果
| 問題 |
No.3199 Key-Door Grid
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-07-11 21:44:27 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 2,033 bytes |
| コンパイル時間 | 615 ms |
| コンパイル使用メモリ | 81,664 KB |
| 実行使用メモリ | 300,624 KB |
| 最終ジャッジ日時 | 2025-07-11 21:44:40 |
| 合計ジャッジ時間 | 5,004 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | TLE * 1 -- * 36 |
ソースコード
from collections import deque
h, w, m = map(int, input().split())
mp = [input() for _ in range(h)]
sx, sy = 0, 0
gx, gy = 0, 0
for i in range(h):
for j in range(w):
if mp[i][j] == 'S':
sx, sy = i, j
mp[i] = mp[i][:j] + '.' + mp[i][j+1:]
elif mp[i][j] == 'G':
gx, gy = i, j
mp[i] = mp[i][:j] + '.' + mp[i][j+1:]
que = deque([(sx, sy, 0, 0)]) # (x,y,key,dist)
dx = [1, -1, 0, 0]
dy = [0, 0, 1, -1]
visited = [[(-1, 0)]*w for _ in range(h)] # (x,y) -> key
visited[sx][sy] = (0, 0)
nums = set([str(i) for i in range(1, m + 1)])
alps = set([chr(i) for i in range(ord('a'), ord('a') + m)])
while que:
x, y, key, dist = que.popleft()
if (x, y) == (gx, gy):
print(dist)
exit()
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if 0 <= nx < h and 0 <= ny < w:
if mp[nx][ny] == '#':
continue
if mp[nx][ny] == '.':
if visited[nx][ny][0] != key and visited[nx][ny][1] < dist + 1:
visited[nx][ny] = (key, dist + 1)
que.append((nx, ny, key, dist + 1))
elif mp[nx][ny] in nums:
new_key = ord(mp[nx][ny]) - ord('0')
if visited[nx][ny][0] != new_key and visited[nx][ny][1] < dist + 1:
visited[nx][ny] = (new_key, dist + 1)
que.append((nx, ny, new_key, dist + 1))
elif mp[nx][ny] in alps:
if key == 0:
continue
if key == ord(mp[nx][ny]) - ord('a') + 1:
if visited[nx][ny] != key and visited[nx][ny][1] < dist + 1:
visited[nx][ny] = (key, dist + 1)
que.append((nx, ny, key, dist + 1))
elif mp[nx][ny] == 'G':
if visited[nx][ny] != key and visited[nx][ny][1] < dist + 1:
visited[nx][ny] = (key, dist + 1)
que.append((nx, ny, key, dist + 1))
print(-1)