ํ์ด
๊ฐ๋ง์ ๊ทธ๋ํํ์ ๋ฌธ์ ์ด๋ค.
๋ ๊ฐ์ ๊ตฌ์ฌ์ด ์์นํ ๋ณด๋๋ฅผ ๊ธฐ์ธ์ฌ์ ๋นจ๊ฐ๊ตฌ์ฌ๋ง 10๋ฒ์์ ํ์ถ์ํค๋ฉด ์ฑ๊ณตํ๋ ๊ฒ์์ด๋ค.
์ฒ์์ ๊ฐ ๊ตฌ์ฌ์ ๋ํ์ฌ BFS ๋ฅผ ์คํํ๋ฉด ๋๋ ์ค ์์๋๋ฐ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ๊ฐ ๋ฌธ์ ์ฌ์ ๋ค๋ฅธ๋ถ๋ค์ ํ์ด๋ฅผ ์ฐธ๊ณ ํ๋ฉด์ ํ์๋ค.
ํ BFS ๋ฌธ์ ๋ค๊ณผ์ ์ฐจ์ด์ ์ด ์์๋๋ฐ,
-
์ด๋ํ ๋ฐฉํฅ์ด ๋ฒฝ์ ๋ฟ์ ๋ ๊น์ง ํน์ ๋์ฐฉ์ ์ ๋์ฐฉํ ๋ ๊น์ง ๊ฐ์ ๋ฐฉํฅ์ผ๋ก ์ญ ์ด๋ํด์ผ ํ๋ค๋ ์กฐ๊ฑด.
-
๋ ๊ตฌ์ฌ์ด ํจ๊ป ์์ง์ธ๋ค๋ ์กฐ๊ฑด.
์ ๋๊ฐ์ง ์กฐ๊ฑด์ ๋ชจ๋ ์ถฉ์กฑ์ํค๋ฉด์ ๋ฌธ์ ๋ฅผ ํ์ด์ผํ๋ค.
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()