chldkato

백준 13460 구슬 탈출 2 (파이썬) 본문

백준

백준 13460 구슬 탈출 2 (파이썬)

chldkato 2020. 2. 16. 21:26

https://www.acmicpc.net/problem/13460

 

13460번: 구슬 탈출 2

첫 번째 줄에는 보드의 세로, 가로 크기를 의미하는 두 정수 N, M (3 ≤ N, M ≤ 10)이 주어진다. 다음 N개의 줄에 보드의 모양을 나타내는 길이 M의 문자열이 주어진다. 이 문자열은 '.', '#', 'O', 'R', 'B' 로 이루어져 있다. '.'은 빈 칸을 의미하고, '#'은 공이 이동할 수 없는 장애물 또는 벽을 의미하며, 'O'는 구멍의 위치를 의미한다. 'R'은 빨간 구슬의 위치, 'B'는 파란 구슬의 위치이다. 입력되는 모든 보드

www.acmicpc.net

1. 빨간 구슬과 파란 구슬을 기울인 방향에 대해서 갈 수 있는 만큼 이동했을 때의 좌표를 구한다

2. 중간에 파란 구슬이 구멍에 빠지면 continue하여 다른 방향으로 기울인 경우로 넘어간다

3. 빨간 구슬과 파란 구슬이 겹치면 각각 이동한 길이를 구하여 앞뒤로 위치하도록 처리한다

4. 빨간 구슬이 빠지면 기울인 횟수를 출력하고 10번이 넘어가면 -1 출력 

from collections import deque

dx = [0, 0, 1, -1]
dy = [1, -1, 0, 0]

def bfs(rx, ry, bx, by, cnt):
    q.append([rx, ry, bx, by])
    c.append([rx, ry, bx, by])
    while q:
        qlen = len(q)
        while qlen:
            rx, ry, bx, by = q.popleft()
            if a[rx][ry] == 'O':
                print(cnt)
                return
            for i in range(4):
                nrx, nry, nbx, nby = rx, ry, bx, by
                while True:
                    nrx += dx[i]; nry += dy[i]
                    if a[nrx][nry] == 'O':
                        break
                    if a[nrx][nry] == '#':
                        nrx -= dx[i]; nry -= dy[i]
                        break
                while True:
                    nbx += dx[i]; nby += dy[i]
                    if a[nbx][nby] == 'O':
                        break
                    if a[nbx][nby] == '#':
                        nbx -= dx[i]; nby -= dy[i]
                        break

                if a[nbx][nby] == 'O':
                    continue
                if nrx == nbx and nry == nby:
                    if abs(rx - nrx) + abs(ry - nry) > abs(bx - nbx) + abs(by - nby):
                        nrx -= dx[i]; nry -= dy[i]
                    else:
                        nbx -= dx[i]; nby -= dy[i]

                if [nrx, nry, nbx, nby] not in c:
                    c.append([nrx, nry, nbx, nby])
                    q.append([nrx, nry, nbx, nby])
            qlen -= 1

        if cnt == 10:
            print(-1)
            return
        cnt += 1
    print(-1)
    return

n, m = map(int, input().split())
a = [[] for _ in range(n)]
c, q, cnt = [], deque(), 0

for i in range(n):
        a[i] = list(map(str, input()))
        for j in range(m):
            if a[i][j] == 'R':
                rx, ry = i, j
                a[i][j] = '.'
            elif a[i][j] == 'B':
                bx, by = i, j;
                a[i][j] = '.'

bfs(rx, ry, bx, by, cnt)

Comments