結果
| 問題 | No.3504 Insert Maze |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-04-18 20:02:00 |
| 言語 | Python3 (3.14.3 + numpy 2.4.4 + scipy 1.17.1) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 4,177 bytes |
| 記録 | |
| コンパイル時間 | 509 ms |
| コンパイル使用メモリ | 20,700 KB |
| 実行使用メモリ | 74,152 KB |
| 最終ジャッジ日時 | 2026-04-18 20:03:19 |
| 合計ジャッジ時間 | 23,334 ms |
|
ジャッジサーバーID (参考情報) |
judge3_0 / judge2_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 24 WA * 3 TLE * 1 -- * 57 |
ソースコード
import sys
from collections import deque
def solve():
input = sys.stdin.read
data = input().split()
if not data:
return
H = int(data[0])
W = int(data[1])
grid = data[2:]
# 頂点の状態を拡張:
# 0: 通常のマスにいる
# 1: 挿入された行 (縦方向に自由に動ける通路の横移動中) にいる
# 2: 挿入された列 (横方向に自由に動ける通路の縦移動中) にいる
# 距離配列
INF = float('inf')
dist = [[[INF] * W for _ in range(H)] for _ in range(3)]
# deque (cost, state, r, c)
q = deque()
# スタート地点
dist[0][0][0] = 0
q.append((0, 0, 0, 0))
# 移動方向 (上下左右)
dr = [-1, 1, 0, 0]
dc = [0, 0, -1, 1]
while q:
d, state, r, c = q.popleft()
if d > dist[state][r][c]:
continue
if r == H - 1 and c == W - 1 and state == 0:
print(d)
return
# 状態 0: 通常のマス
if state == 0:
# 1. 通常の移動 (隣接するマスへ)
for i in range(4):
nr, nc = r + dr[i], c + dc[i]
if 0 <= nr < H and 0 <= nc < W and grid[nr][nc] != '#':
if dist[0][nr][nc] > d + 1:
dist[0][nr][nc] = d + 1
q.append((d + 1, 0, nr, nc))
# 2. 挿入された行に入る (下向きに挿入された行があるとする)
if r + 1 < H:
if dist[1][r][c] > d + 1:
dist[1][r][c] = d + 1
q.append((d + 1, 1, r, c))
# 挿入された行に入る (上向き)
if r - 1 >= 0:
if dist[1][r - 1][c] > d + 1:
dist[1][r - 1][c] = d + 1
q.append((d + 1, 1, r - 1, c))
# 3. 挿入された列に入る (右向き)
if c + 1 < W:
if dist[2][r][c] > d + 1:
dist[2][r][c] = d + 1
q.append((d + 1, 2, r, c))
# 挿入された列に入る (左向き)
if c - 1 >= 0:
if dist[2][r][c - 1] > d + 1:
dist[2][r][c - 1] = d + 1
q.append((d + 1, 2, r, c - 1))
# 状態 1: 挿入された行にいる場合
elif state == 1:
# 1. 同じ挿入行内を左右に移動
for nc in [c - 1, c + 1]:
if 0 <= nc < W:
if dist[1][r][nc] > d + 1:
dist[1][r][nc] = d + 1
q.append((d + 1, 1, r, nc))
# 2. 元のグリッド (上下の行のどちらか) に戻る
for nr in [r, r + 1]: # r は挿入行のすぐ上の行インデックス
if 0 <= nr < H and grid[nr][c] != '#':
if dist[0][nr][c] > d + 1:
dist[0][nr][c] = d + 1
q.append((d + 1, 0, nr, c))
# (挿入された行から別の挿入された列へ直接移ることは、交差点が通路になるため可能ですが
# 一度通常マスを介すのと同等なので省略可能)
# 状態 2: 挿入された列にいる場合
elif state == 2:
# 1. 同じ挿入列内を上下に移動
for nr in [r - 1, r + 1]:
if 0 <= nr < H:
if dist[2][nr][c] > d + 1:
dist[2][nr][c] = d + 1
q.append((d + 1, 2, nr, c))
# 2. 元のグリッド (左右の列のどちらか) に戻る
for nc in [c, c + 1]: # c は挿入列のすぐ左の列インデックス
if 0 <= nc < W and grid[r][nc] != '#':
if dist[0][r][nc] > d + 1:
dist[0][r][nc] = d + 1
q.append((d + 1, 0, r, nc))
# ゴールに到達できない場合
print(-1)
if __name__ == '__main__':
solve()