ํ’€์ด


๊ฐ„๋งŒ์— ๊ทธ๋ž˜ํ”„ํƒ์ƒ‰ ๋ฌธ์ œ์ด๋‹ค.

๋‘ ๊ฐœ์˜ ๊ตฌ์Šฌ์ด ์œ„์น˜ํ•œ ๋ณด๋“œ๋ฅผ ๊ธฐ์šธ์—ฌ์„œ ๋นจ๊ฐ„๊ตฌ์Šฌ๋งŒ 10๋ฒˆ์•ˆ์— ํƒˆ์ถœ์‹œํ‚ค๋ฉด ์„ฑ๊ณตํ•˜๋Š” ๊ฒŒ์ž„์ด๋‹ค.

์ฒ˜์Œ์—” ๊ฐ ๊ตฌ์Šฌ์— ๋Œ€ํ•˜์—ฌ BFS ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋˜๋Š” ์ค„ ์•Œ์•˜๋Š”๋ฐ ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ๊ฐ€ ๋ฌธ์ œ์—ฌ์„œ ๋‹ค๋ฅธ๋ถ„๋“ค์˜ ํ’€์ด๋ฅผ ์ฐธ๊ณ ํ•˜๋ฉด์„œ ํ’€์—ˆ๋‹ค.

ํƒ€ BFS ๋ฌธ์ œ๋“ค๊ณผ์˜ ์ฐจ์ด์ ์ด ์žˆ์—ˆ๋Š”๋ฐ,

  1. ์ด๋™ํ•œ ๋ฐฉํ–ฅ์ด ๋ฒฝ์— ๋‹ฟ์„ ๋•Œ ๊นŒ์ง€ ํ˜น์€ ๋„์ฐฉ์ ์— ๋„์ฐฉํ•  ๋•Œ ๊นŒ์ง€ ๊ฐ™์€ ๋ฐฉํ–ฅ์œผ๋กœ ์ญ‰ ์ด๋™ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์กฐ๊ฑด.

  2. ๋‘ ๊ตฌ์Šฌ์ด ํ•จ๊ป˜ ์›€์ง์ธ๋‹ค๋Š” ์กฐ๊ฑด.

์œ„ ๋‘๊ฐ€์ง€ ์กฐ๊ฑด์„ ๋ชจ๋‘ ์ถฉ์กฑ์‹œํ‚ค๋ฉด์„œ ๋ฌธ์ œ๋ฅผ ํ’€์–ด์•ผํ–ˆ๋‹ค.

move() ํ•จ์ˆ˜๋ฅผ ์ƒˆ๋กœ ์ •์˜ํ•˜๋ฉด์„œ ๊ฐ ๋ฐฉํ–ฅ๋งˆ๋‹ค ๋ฒฝ์— ๋‹ฟ๊ฑฐ๋‚˜ ๋„์ฐฉ์ ์— ๋„์ฐฉํ•  ๊ฒฝ์šฐ๊นŒ์ง€ ์ด๋™ ํ›„ ์ขŒํ‘œ๋ฅผ ๋ฆฌํ„ดํ•ด์ฃผ๋Š” ์‹์œผ๋กœ ๊ตฌํ˜„ํ•˜์˜€๊ณ  ์ด ๋•Œ ๋‘ ๊ฐœ์˜ ๊ตฌ์Šฌ์ด ํ•จ๊ป˜ ์›€์ง์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฒน์น  ๊ฐ€๋Šฅ์„ฑ์„ ๊ณ ๋ คํ•˜์—ฌ ์–ผ๋งˆ๋‚˜ ์ด๋™ํ–ˆ๋Š”์ง€๋ฅผ ํŒ๋‹จํ•  c ๊ฐ’์„ ์ถ”๊ฐ€๋กœ ๋ฆฌํ„ดํ•ด์ฃผ์—ˆ๋‹ค.

์ด๋™ ํ›„ ํŒŒ๋ž€ ๊ตฌ์Šฌ์€ ๋„์ฐฉ์ ์— ๋„์ฐฉํ•˜์ง€ ์•Š๊ณ  ๋นจ๊ฐ„ ๊ตฌ์Šฌ๋งŒ ๋„์ฐฉ์ ์— ๋„์ฐฉํ–ˆ๋‹ค๋ฉด ์ •๋‹ต์ด๊ธฐ ๋•Œ๋ฌธ์— ํ˜„์žฌ๊นŒ์ง€ ๋ช‡ ๋ฒˆ ๊ธฐ์šธ์˜€๋Š”์ง€ ์ถœ๋ ฅํ•˜๊ณ  ์ข…๋ฃŒํ•˜๋ฉด๋œ๋‹ค.

๋งŒ์•ฝ ๋‘ ๊ฐœ์˜ ๊ตฌ์Šฌ์ด ๊ฒน์ณค์„ ๊ฒฝ์šฐ ๋” ๋งŽ์ด ์ด๋™ํ•œ ๊ตฌ์Šฌ์ด ๋’ค์ชฝ์— ์œ„์น˜ํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ๊ตฌ์Šฌ์˜ ์ขŒํ‘œ๋ฅผ ํ•œ ์นธ ๋ฐ€์–ด์„œ ๋ฐฐ์น˜ํ•ด์ค€๋‹ค.

๋งŒ์•ฝ ์ •๋‹ต์ด ๋‚˜์˜ค์ง€ ์•Š์•˜์œผ๋ฉฐ ๋‘ ๊ตฌ์Šฌ์˜ ์œ„์น˜๊ฐ€ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜๋˜ ๊ฒฝ์šฐ๋ผ๋ฉด ํ•ด๋‹น ๊ฐ’๋“ค์„ ํ์— ๋‹ค์‹œ ์‚ฝ์ž…ํ•ด์ค€ ๋’ค ์œ„ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•œ๋‹ค.

์†Œ์Šค์ฝ”๋“œ


# ๊ตฌ์Šฌ ํƒˆ์ถœ 2
from collections import deque
import sys
input = sys.stdin.readline
 
def move(x, y, dx, dy):
    c = 0
    while board[x + dx][y + dy] != "#" and board[x][y] != "O":  # ๋ฒฝ์„ ๋งŒ๋‚˜๊ฑฐ๋‚˜ ๋„์ฐฉ์ ์— ๋„์ฐฉํ•  ๋•Œ ๊นŒ์ง€
        x += dx
        y += dy
        c += 1
    return x, y, c
 
def bfs():
    while q:
        rx, ry, bx, by, d = q.popleft()
        if d > 10:  # 10๋ฒˆ ์ด์ƒ ๊ธฐ์šธ์˜€์„ ๊ฒฝ์šฐ ์‹คํŒจ
            break
        for i in range(4):
            nrx, nry, rc = move(rx, ry, dx[i], dy[i])
            nbx, nby, bc = move(bx, by, dx[i], dy[i])
            if board[nbx][nby] != "O":  # ํŒŒ๋ž€๊ตฌ์Šฌ์ด ๋„์ฐฉ์ ์— ์œ„์น˜ํ•˜์ง€ ์•Š๊ณ 
                if board[nrx][nry] == "O":  # ๋นจ๊ฐ„๊ตฌ์Šฌ๋งŒ ๋„์ฐฉ์ ์— ์œ„์น˜ํ–ˆ์„ ๋•Œ
                    print(d)  # ๊ธฐ์šธ์ธ ํšŸ์ˆ˜ ์ถœ๋ ฅ ํ›„ ์ข…๋ฃŒ
                    return
                if nrx == nbx and nry == nby:  # ํŒŒ๋ž€๊ตฌ์Šฌ๊ณผ ๋นจ๊ฐ„๊ตฌ์Šฌ์ด ๊ฒน์ณค์„ ๊ฒฝ์šฐ
                    if rc > bc:  # ๋นจ๊ฐ„๊ตฌ์Šฌ์ด ๋” ๋งŽ์ด ์ด๋™ํ–ˆ์„ ๊ฒฝ์šฐ ํ•œ ์นธ ๋’ค๋กœ
                        nrx -= dx[i]
                        nry -= dy[i]
                    else:  # ํŒŒ๋ž€๊ตฌ์Šฌ์ด ๋” ๋งŽ์ด ์ด๋™ํ–ˆ์„ ๊ฒฝ์šฐ ํ•œ ์นธ ๋’ค๋กœ
                        nbx -= dx[i]
                        nby -= dy[i]
                if not visited[nrx][nry][nbx][nby]:  # ์ด๋™ ํ›„ ๋นจ๊ฐ„๊ตฌ์Šฌ๊ณผ ํŒŒ๋ž€๊ตฌ์Šฌ์˜ ์œ„์น˜๊ฐ€ ์•„์ง ํ•œ ๋ฒˆ๋„ ์œ„์น˜ํ•ด๋ณด์ง€์•Š์•˜๋˜ ์œ„์น˜๋ผ๋ฉด
                    visited[nrx][nry][nbx][nby] = True  # ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ ์ดํ›„ ํ์— ์‚ฝ์ž…
                    q.append([nrx, nry, nbx, nby, d+1])
    print(-1)
 
dx = [1, -1, 0, 0]
dy = [0, 0, 1, -1]
 
n, m = map(int, input().split())
board = []
visited = [[[[False] * m for _ in range(n)] for _ in range(m)] for _ in range(n)]  # ๋นจ๊ฐ„๊ตฌ์Šฌ๊ณผ ํŒŒ๋ž€๊ตฌ์Šฌ์˜ ์ขŒํ‘œ์— ๋Œ€ํ•œ ๋ฐฉ๋ฌธ์ขŒํ‘œ ์„ ์–ธ
 
for i in range(n):
    line = list(input().rstrip())
    board.append(line)
    for j in range(m):
        if line[j] == "B":
            bx, by = i, j
        elif line[j] == "R":
            rx, ry = i, j
 
q = deque()
q.append([rx, ry, bx, by, 1])
visited[rx][ry][bx][by] = True
bfs()

References