結果

問題 No.367 ナイトの転身
ユーザー noriocnorioc
提出日時 2024-08-21 00:05:20
言語 PyPy3
(7.3.15)
結果
AC  
実行時間 658 ms / 2,000 ms
コード長 1,522 bytes
コンパイル時間 349 ms
コンパイル使用メモリ 82,568 KB
実行使用メモリ 157,704 KB
最終ジャッジ日時 2024-08-21 00:05:25
合計ジャッジ時間 4,941 ms
ジャッジサーバーID
(参考情報)
judge1 / judge5
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 45 ms
56,056 KB
testcase_01 AC 42 ms
54,600 KB
testcase_02 AC 44 ms
55,700 KB
testcase_03 AC 42 ms
55,576 KB
testcase_04 AC 45 ms
54,404 KB
testcase_05 AC 41 ms
54,384 KB
testcase_06 AC 46 ms
56,776 KB
testcase_07 AC 43 ms
54,432 KB
testcase_08 AC 41 ms
55,052 KB
testcase_09 AC 41 ms
54,056 KB
testcase_10 AC 422 ms
116,572 KB
testcase_11 AC 658 ms
157,704 KB
testcase_12 AC 142 ms
86,516 KB
testcase_13 AC 147 ms
87,428 KB
testcase_14 AC 276 ms
92,512 KB
testcase_15 AC 90 ms
77,220 KB
testcase_16 AC 232 ms
91,532 KB
testcase_17 AC 106 ms
78,372 KB
testcase_18 AC 125 ms
79,064 KB
testcase_19 AC 114 ms
79,928 KB
testcase_20 AC 89 ms
78,048 KB
testcase_21 AC 119 ms
79,896 KB
testcase_22 AC 48 ms
62,956 KB
testcase_23 AC 65 ms
70,308 KB
testcase_24 AC 90 ms
76,916 KB
testcase_25 AC 85 ms
76,808 KB
testcase_26 AC 65 ms
71,404 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

from collections import deque


def list3(a, b, c, *, val=0):
    return [[[val] * c for _ in range(b)] for _ in range(a)]


H, W = map(int, input().split())
G = [input() for _ in range(H)]


def find(c) -> tuple[int, int]:
    for i in range(H):
        for j in range(W):
            if G[i][j] == c:
                return i, j

    assert False


def move_knight(r, c):
    res = []
    for dr, dc in [(-2, 1), (-1, 2), (1, 2), (2, 1), (2, -1), (1, -2), (-1, -2), (-2, -1)]:
        nr = r + dr
        nc = c + dc
        if not (0 <= nr < H and 0 <= nc < W): continue
        res.append((nr, nc))

    return res


def move_bishop(r, c):
    res = []
    for dr, dc in [(-1, 1), (1, 1), (1, -1), (-1, -1)]:
        nr = r + dr
        nc = c + dc
        if not (0 <= nr < H and 0 <= nc < W): continue
        res.append((nr, nc))

    return res


KNIGHT = 0
BISHOP = 1
start = find('S')

q = deque([(start[0], start[1], 0, 0)])
# used = set()
used = list3(H, W, 2, val=False)
while q:
    r, c, step, piece = q.popleft()
    # if (r, c, piece) in used: continue
    # used.add((r, c, piece))
    if used[r][c][piece]: continue
    used[r][c][piece] = True

    if G[r][c] == 'G':
        print(step)
        break

    movefn = move_knight if piece == 0 else move_bishop
    for nr, nc in movefn(r, c):
        np = piece
        if G[nr][nc] == 'R':
            np ^= 1

        # if (nr, nc, np) in used: continue
        if used[nr][nc][np]: continue
        q.append((nr, nc, step+1, np))

else:
    print(-1)
0