๋ชจ๋ ๊ฐ๋ฅ์ฑ์ ๊ณ ๋ คํ๋ฉด์ ์ต์ ํ์๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ์ด๋ฏ๋ก ๊ทธ๋ํ ํ์์ ๋๋น ์ฐ์ ํ์ ๋ฐฉ์๊ณผ ๊ตฌ์ฌ์ ์ด๋ ๊ฒฝ๋ก๋ฅผ ์๋ฎฌ๋ ์ด์ ํ๋ ๋ ๊ฐ์ง ๋ฐฉ์์ ํฉํด์ ํ์ดํ๋ค.
์ฐ์ ๋นจ๊ฐ ๊ตฌ์ฌ๊ณผ ํ๋ ๊ตฌ์ฌ์ ์ฌ๋ฐฉ์ผ๋ก ์์ง์ผ ์ ์๊ณ , ๋ฒฝ์ ๋ง์ฃผํ๊ฑฐ๋ ๋ค๋ฅธ ๊ตฌ์ฌ์ ๋ง๋๊ธฐ ์ ๊น์ง๋ ๊ณ์ ์์ง์ด๊ฒ ๋๋ค. ๊ทธ๋์ ๋ฒฝ์ ๋ง์ฃผํ๊ฑฐ๋ ๋ค๋ฅธ ๊ตฌ์ฌ์ ๋ง์ฃผ์น ๋๊น์ง ๊ณ์ ์์ง์ด๋ค๊ฐ ํด๋น ์กฐ๊ฑด์ ๊ฑธ๋ฆฌ๊ฒ ๋๋ฉด ์ง์ ์์น๊น์ง๋ง ์ด๋ํ๋ ๊ฒ์ผ๋ก ๊ณ์ฐํ๋ค.
์ด๋ค ๊ตฌ์ฌ์ด๋ ๊ตฌ๋ฉ์ ๋ค์ด๊ฐ๊ฒ ๋๋ฉด ์ขํ ์์๋ ์์น๊ฐ ์กด์ฌํ์ง ์๊ฒ ๋๋ค. ์ด๋๋ (-1, -1)๋ก ์์น๋ฅผ ๋ณ๊ฒฝํ๋ค. ๋ง์ฝ ๋ ๊ตฌ์ฌ์ ์ขํ๊ฐ ํด๋น ์ขํ๊ฐ์ด๋ผ๋ฉด ๊ตฌ๋ฉ ์์ผ๋ก ๋ค์ด๊ฐ๊ฒ ๋ ๊ฒ์ผ๋ก ํ๋จํ๋ค.
๋ ๊ตฌ์ฌ์ ์์น ์ขํ๊ฐ์ ํค ๊ฐ์ผ๋ก ๋ฐฉ๋ฌธ์ฒ๋ฆฌ๋ฅผ ํ๋ค. ๋ ๊ตฌ์ฌ์ ์์น์ ๋๊ฐ์ ์์น์ ๋ค์ ์์นํ๊ฒ ๋๋ค๋ฉด ๊ฒฐ๊ตญ ํ ๋ฒ ๋ฐฉ๋ฌธํ๋ ๊ณณ์ด ๋๋ฏ๋ก, ๋ ๊ตฌ์ฌ์ ์์น๊ฐ๊ณผ ๋๊ฐ์ ๊ฐ์ด ๋ ๋์์ ๋ ๋ฐฉ๋ฌธํ๊ฒ ํ๋ ์ผ์ ์๊ฒ ํ๋ค.
๋นจ๊ฐ ๊ตฌ์ฌ๋ง ๊ตฌ๋ฉ์ ๋ค์ด๊ฐ๋ ๊ฒฝ์ฐ ์นด์ดํธ ๊ฐ์ ์ถ๋ ฅํ๋ค. ์ด๋ ํ๋ ๊ตฌ์ฌ๋ ๊ตฌ๋ฉ์ ๋ค์ด๊ฐ๊ฒ ๋๋ค๋ฉด ํด๋น ๊ฒฝ์ฐ๋ ๊ทธ๋ฅ ๋์ด๊ฐ๋ค.
๋ฐ๋ก
7 8
########
#.#O.#R#
#....#B#
#.#....#
#......#
#......#
########
answer : 9
# ๊ตฌ์ฌ ํ์ถ
def move(this_x, this_y, other_x, other_y, d, is_red):
global is_blue_in_hole, is_red_in_hole
while True:
next_x = this_x + direction[d][0]
next_y = this_y + direction[d][1]
if board[next_x][next_y] == "#" or (next_x == other_x and next_y == other_y):
return this_x, this_y
elif board[next_x][next_y] == "O":
if is_red:
is_red_in_hole = True
else:
is_blue_in_hole = True
return (-1, -1)
this_x = next_x
this_y = next_y
def up(R, B):
if R[0] <= B[0]:
R = move(*R, *B, 0, True)
B = move(*B, *R, 0, False)
else:
B = move(*B, *R, 0, False)
R = move(*R, *B, 0, True)
return R, B
def down(R, B):
if R[0] >= B[0]:
R = move(*R, *B, 1, True)
B = move(*B, *R, 1, False)
else:
B = move(*B, *R, 1, False)
R = move(*R, *B, 1, True)
return R, B
def right(R, B):
if R[1] >= B[1]:
R = move(*R, *B, 2, True)
B = move(*B, *R, 2, False)
else:
B = move(*B, *R, 2, False)
R = move(*R, *B, 2, True)
return R, B
def left(R, B):
if R[1] <= B[1]:
R = move(*R, *B, 3, True)
B = move(*B, *R, 3, False)
else:
B = move(*B, *R, 3, False)
R = move(*R, *B, 3, True)
return R, B
N, M = map(int, input().split())
board = [list(input()) for _ in range(N)]
direction = ((-1, 0), (1, 0), (0, 1), (0, -1))
for i in range(N):
for j in range(M):
if board[i][j] == "R":
R = (i, j)
board[i][j] = "."
elif board[i][j] == "B":
B = (i, j)
board[i][j] = "."
is_red_in_hole = False
is_blue_in_hole = False
def sol(R, B):
move_fn = {
0: (lambda x: up(x[0], x[1])),
1: (lambda x: down(x[0], x[1])),
2: (lambda x: right(x[0], x[1])),
3: (lambda x: left(x[0], x[1]))
}
visited = {(R, B): True}
queue = [(R, B, 0)]
while queue:
R, B, cnt = queue.pop(0)
# print(R, B, cnt)
if cnt >= 10:
return -1
for k in range(4):
new_R, new_B = move_fn[k]((R, B))
if not visited.get((new_R, new_B)):
visited[(new_R, new_B)] = True
queue.append((new_R, new_B, cnt+1))
if new_R == (-1, -1) and new_B != (-1, -1):
return cnt + 1
return -1
print(sol(R, B))