백준 13460
🔍 알고리즘 분류
💡 문제 풀이
goToEnd: 구슬이 한 방향으로 갈 수 있는 최대한으로 이동
- 빨간 구슬과 파란 구슬에 대해 각각
goToEnd 진행
- 파란 구슬이
O에 있을 경우 continue, 빨간 구슬이 O에 있을 경우 답 출력
- 이동한 빨간 구슬과 파란 구슬의 위치가 겹쳐있을 경우:
더 많이 이동한 구슬 한 칸 뒤로
- 두 구슬의 이동한 위치가
visited에 없을 경우 계속 탐색
(visited 함수에는 빨간 구슬과 파란 구슬의 이동한 마지막 위치만 저장)
📄 코드
from collections import deque
import sys
input = sys.stdin.readline
n, m = map(int, input().split())
board = [list(input().rstrip()) for _ in range(n)]
visited = []
dx = [1, -1, 0, 0]
dy = [0, 0, -1, 1]
def getPos():
rx, ry, bx, by = 0, 0, 0, 0
for x in range(n):
for y in range(m):
if board[x][y] == "R":
rx, ry = x, y
if board[x][y] == "B":
bx, by = x, y
return rx, ry, bx, by
def goToEnd(x, y, dx, dy):
cnt = 0
while board[x + dx][y + dy] != "#" and board[x][y] != "O":
x += dx
y += dy
cnt +=1
return x, y, cnt
def bfs():
rx, ry, bx, by = getPos()
q = deque()
q.append((rx, ry, bx, by, 1))
visited.append((rx, ry, bx, by))
while q:
rx, ry, bx, by, result = q.popleft()
if result > 10:
break
for i in range(4):
nrx, nry, rcnt = goToEnd(rx, ry, dx[i], dy[i])
nbx, nby, bcnt = goToEnd(bx, by, dx[i], dy[i])
if board[nbx][nby] == "O":
continue
if board[nrx][nry] == "O":
print(result)
return
if nrx == nbx and nry == nby:
if rcnt > bcnt:
nrx -= dx[i]
nry -= dy[i]
else:
nbx -= dx[i]
nby -= dy[i]
if (nrx, nry, nbx, nby) not in visited:
visited.append((nrx, nry, nbx, nby))
q.append((nrx, nry, nbx, nby, result + 1))
print(-1)
bfs()