13460 - 구슬탈출2*

2022. 5. 3. 13:512022/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