본문 바로가기

알고리즘/백준 (Pyhthon)

[알고리즘] 백준 15653 구슬 탈출 4 / 파이썬

www.acmicpc.net/problem/15653

 

15653번: 구슬 탈출 4

첫 번째 줄에는 보드의 세로, 가로 크기를 의미하는 두 정수 N, M (3 ≤ N, M ≤ 10)이 주어진다. 다음 N개의 줄에 보드의 모양을 나타내는 길이 M의 문자열이 주어진다. 이 문자열은 '.', '#', 'O', 'R', 'B'

www.acmicpc.net

 

from collections import deque

def move(x, y, dx, dy):
    m = 0
    while True:
        if B[x][y] == 'O':
            break
        if B[x][y] == '#':
            x -= dx
            y -= dy
            break
        x += dx
        y += dy
        m += 1
    return x, y, m

dx, dy = [-1, 0, 1, 0], [0, -1, 0, 1]
def sol():
    while q:
        result, rx, ry, bx, by = q.popleft()
        for i in range(4):
            mrx, mry, mr = move(rx, ry, dx[i], dy[i])
            mbx, mby, mb = move(bx, by, dx[i], dy[i])
            if B[mbx][mby] == 'O':
                continue
            if B[mrx][mry] == 'O':
                return result
            if mrx == mbx and mry == mby:
                if mr < mb: mbx, mby = mbx-dx[i], mby-dy[i]
                else: mrx, mry = mrx-dx[i], mry-dy[i]
            if ck[mrx][mry][mbx][mby] == 0:
                ck[mrx][mry][mbx][mby] = 1
                q.append([result+1, mrx, mry, mbx, mby])
    return -1

N, M = map(int, input().split(' '))
B = [list(input()) for _ in range(N)]
for i in range(N):
    for j in range(M):
        if B[i][j] == 'R':
            rx, ry = i, j
            B[i][j] = '.'
        elif B[i][j] == 'B':
            bx, by = i, j
            B[i][j] = '.'
q = deque()
q.append([1, rx, ry, bx, by])
ck = [[[[0]*M for _ in range(N)] for _ in range(M)] for _ in range(N)]
ck[rx][ry][bx][by] = 1
print(sol())