import sys
from collections import deque
input = sys.stdin.readline
def bfs(red,blue):
stack = deque()
stack.append((*red,*blue,0))
dx = [-1,1,0,0]
dy = [0,0,-1,1]
while stack:
rx,ry,bx,by,dis = stack.popleft()
for i in range(4):
nrx,nry = rx,ry
r_p = 0
while 0<=nrx<N and 0<=nry<M and arr[nrx][nry] != '#' and arr[nrx][nry] != 'O':
nrx += dx[i]
nry += dy[i]
r_p += 1
nbx,nby = bx,by
b_p = 0
while 0<=nbx<N and 0<=nby<M and arr[nbx][nby] != '#' and arr[nbx][nby] != 'O':
nbx += dx[i]
nby += dy[i]
b_p += 1
if (nbx,nby) == (nrx,nry):
if arr[nbx][nby] == 'O':
continue
if r_p > b_p:
nrx -= dx[i]
nry -= dy[i]
else:
nbx -= dx[i]
nby -= dy[i]
elif arr[nbx][nby] == 'O':
continue
elif arr[nrx][nry] == 'O':
return dis+1
nrx -= dx[i]
nry -= dy[i]
nbx -= dx[i]
nby -= dy[i]
if not visited[nrx][nry][nbx][nby]:continue
visited[nrx][nry][nbx][nby] = False
stack.append((nrx,nry,nbx,nby,dis+1))
return -1
N,M = map(int,input().split())
arr = []
blue = []
red = []
for x in range(N):
temp = list(input())
for y in range(M):
if temp[y] == 'B':
blue = (x,y)
elif temp[y] == 'R':
red = (x,y)
arr.append(temp)
visited = [[[[True for _ in range(M)] for _ in range(N)] for _ in range(M)] for _ in range(N)]
result = bfs(red,blue)
print(result)
구슬 탈출의 마지막 시리즈다.
구슬탈출3에서 썼던 코드에서 경로추적이랑 10이상일때 종료인것만 제외시켜줬다.
구슬탈출1~4까지는 다 똑같은 코드이므로,
하나만 잘 풀어놓으면
코드를 1~3군데만 고쳐도 전부 통과할수 있다.
'알고리즘 > 백준' 카테고리의 다른 글
[BOJ/백준] 2233 사과 나무 (0) | 2021.06.14 |
---|---|
[BOJ/백준] 1050 물약 (0) | 2021.06.14 |
[BOJ/백준] 21944 문제 추천 시스템 Version2 (0) | 2021.06.11 |
[BOJ/백준] 21943 연산 최대로 (0) | 2021.06.11 |
[BOJ/백준] 21942 부품 대여장 (0) | 2021.06.11 |