結果

問題 No.367 ナイトの転身
ユーザー noriocnorioc
提出日時 2024-08-21 01:55:03
言語 PyPy3
(7.3.15)
結果
AC  
実行時間 600 ms / 2,000 ms
コード長 1,509 bytes
コンパイル時間 5,161 ms
コンパイル使用メモリ 82,240 KB
実行使用メモリ 149,712 KB
最終ジャッジ日時 2024-08-21 01:55:18
合計ジャッジ時間 5,950 ms
ジャッジサーバーID
(参考情報)
judge3 / judge1
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 36 ms
55,728 KB
testcase_01 AC 35 ms
55,168 KB
testcase_02 AC 38 ms
54,320 KB
testcase_03 AC 36 ms
54,776 KB
testcase_04 AC 36 ms
54,324 KB
testcase_05 AC 34 ms
55,832 KB
testcase_06 AC 40 ms
58,228 KB
testcase_07 AC 48 ms
54,348 KB
testcase_08 AC 35 ms
55,116 KB
testcase_09 AC 37 ms
54,644 KB
testcase_10 AC 413 ms
115,812 KB
testcase_11 AC 600 ms
149,712 KB
testcase_12 AC 172 ms
86,656 KB
testcase_13 AC 154 ms
87,832 KB
testcase_14 AC 276 ms
92,488 KB
testcase_15 AC 100 ms
77,896 KB
testcase_16 AC 250 ms
91,576 KB
testcase_17 AC 120 ms
79,024 KB
testcase_18 AC 164 ms
79,684 KB
testcase_19 AC 143 ms
80,304 KB
testcase_20 AC 88 ms
78,036 KB
testcase_21 AC 125 ms
80,668 KB
testcase_22 AC 46 ms
62,332 KB
testcase_23 AC 70 ms
73,648 KB
testcase_24 AC 99 ms
77,184 KB
testcase_25 AC 95 ms
77,060 KB
testcase_26 AC 61 ms
71,476 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: int, c: int) -> list[tuple[int, int]]:
    #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))
        yield nr, nc

    #return res


def move_bishop(r: int, c: int) -> list[tuple[int, int]]:
    #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))
        yield nr, nc

    #return res


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

q = deque([(start[0], start[1], 0, 0)])
used = list3(H, W, 2, val=False)
while q:
    r, c, step, piece = q.popleft()
    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 used[nr][nc][np]: continue
        q.append((nr, nc, step+1, np))
else:
    print(-1)
0