13460 - 구슬탈출2*
2022. 5. 3. 13:51ㆍ2022/BaekJoon_삼성 SW 역량 테스트 기출
from collections import deque
def bfs(rx,ry,bx,by):
cnt = 0
q = deque()
visited = []
q.append((rx,ry,bx,by))
visited.append((rx,ry,bx,by))
while q:
for _ in range(len(q)):
rx,ry,bx,by = q.popleft()
if cnt > 10:
print(-1)
return
if graph[rx][ry] == 'O':
print(cnt)
return
for i in range(4):
nrx, nry = rx, ry
nbx, nby = bx, by
while True:
nrx += dx[i]; nry += dy[i]
if graph[nrx][nry] == "#":
nrx -= dx[i]; nry -= dy[i]
break
elif graph[nrx][nry] == "O":
break
while True:
nbx += dx[i]; nby += dy[i]
if graph[nbx][nby] == "#":
nbx -= dx[i]; nby -= dy[i]
break
elif graph[nbx][nby] == "O":
break
# 파란색 공이 구멍(0)으로 빠지는 경우에는 그냥 continue
if graph[nbx][nby] == "O":
continue
# 공이 겹치는 경우
if (nbx == nrx) and (nby == nry):
# 빨간 색 공이 더 멀리 있는 경우에는, 파란 공이 먼저 옴
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:
q.append((nrx,nry,nbx,nby))
visited.append((nrx,nry,nbx,nby))
cnt += 1
print(-1)
N, M = map(int, input().split())
graph = []
for i in range(N):
MList = list(map(str, input()))
if 'B' in MList:
bx = i; by = MList.index('B')
if 'R' in MList:
rx = i; ry = MList.index('R')
graph.append(MList)
#오른쪽, 위쪽, 왼쪽, 아래
dx = [1, 0, -1, 0]
dy = [0, 1, 0, -1]
bfs(rx,ry,bx,by)
'2022 > BaekJoon_삼성 SW 역량 테스트 기출' 카테고리의 다른 글
13458 - 시험감독 (0) | 2022.05.03 |
---|---|
3190 - 뱀 (0) | 2022.05.03 |
12100 - 2048(Easy)* (0) | 2022.05.03 |
14888번 - 연산자 끼워넣기* (0) | 2022.04.08 |
14501번 - 퇴사* (0) | 2022.04.02 |