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 |