나의 코드
import sys
from collections import deque
input = sys.stdin.readline
n, m = map(int, input().split())
maps = []
dx = [0, 0, 1, -1]
dy = [1, -1, 0, 0]
for i in range(n):
maps.append(list(input()))
for j in range(m):
if maps[i][j] == 'R':
rx, ry = i, j
elif maps[i][j] == 'B':
bx, by = i, j
def bfs(rx, ry, bx, by):
count = 0
queue = deque()
queue.append((rx, ry, bx, by))
visited = [(rx, ry, bx, by)]
while queue:
for _ in range(len(queue)):
rx, ry, bx, by = queue.popleft()
if count > 10:
return -1
if maps[rx][ry] == 'O':
return count
for i in range(4):
nrx, nry = rx, ry
while True:
nrx += dx[i]
nry += dy[i]
if maps[nrx][nry] == '#':
nrx -= dx[i]
nry -= dy[i]
break
elif maps[nrx][nry] == 'O':
break
nbx, nby = bx, by
while True:
nbx += dx[i]
nby += dy[i]
if maps[nbx][nby] == '#':
nbx -= dx[i]
nby -= dy[i]
break
elif maps[nbx][nby] == 'O':
break
if maps[nbx][nby] == 'O':
continue
if nrx == nbx and nry == nby:
if abs(nrx - rx) + abs(nry - ry) > abs(nbx - bx) + abs(nby - by):
nrx -= dx[i]
nry -= dy[i]
else:
nbx -= dx[i]
nby -= dy[i]
if (nrx, nry, nbx, nby) not in visited:
queue.append((nrx, nry, nbx, nby))
visited.append((nrx, nry, nbx, nby))
count += 1
return -1
print(bfs(rx, ry, bx, by))
풀이 방법
1. 파란 구슬과 빨간 구슬을 각각 움직여야 함
2. 움직이면서 벽이나 구멍을 만나면 아웃
3. 파란 구슬만 구멍에 들어갔거나, 빨간 구슬과 함께 들어갔다면 아웃
'백준 알고리즘 (Baekjoon Algorithm)' 카테고리의 다른 글
[파이썬] 백준 알고리즘 No.3055 탈출 (0) | 2023.02.10 |
---|---|
[파이썬] 백준 알고리즘 No.16234 인구 이동 (0) | 2023.02.09 |
[파이썬] 백준 알고리즘 No.2583 영역 구하기 (0) | 2023.02.09 |
[파이썬] 백준 알고리즘 No.2573 빙산 (0) | 2023.02.09 |
[파이썬] 백준 알고리즘 No.9205 맥주 마시면서 걸어가기 (0) | 2023.02.08 |