백준(Python)/골드

백준 13460: 구슬 탈출 2 [Python], 삼성 코딩 테스트

치킨먹고싶어요 2022. 6. 13. 13:32

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

 

13460번: 구슬 탈출 2

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

www.acmicpc.net

import sys
from collections import deque
import copy
 
dy = [10-10]
dx = [010-1]
 
y_lis, x_lis = map(int, sys.stdin.readline().split())
array = list()
 
for i in range(y_lis):
    array.append(list(sys.stdin.readline().strip()))
    for j in range(x_lis):
        if array[i][j] == "R":
            array[i][j] = "."
            ry = i; rx = j;
        elif array[i][j] == "B":
            array[i][j] = "."
            by = i; bx = j;
 
def bfs(y, x, bby, bbx, cnt):
    queue = deque()
    queue.append((y, x, bby, bbx, cnt + 1))
    while queue:
        # R과 B를 초기화 한다.
        for i in range(y_lis):
            for j in range(x_lis):
                if array[i][j] == "R" or array[i][j] == "B":
                    array[i][j] = "."
        # 초기화한 리스트 원소
        y, x, bby, bbx, n = queue.popleft()
 
        # 10번 넘게 반복된다면 0를 return한다.
        if n > 10return 0
 
        # bfs를 한다.
        for i in range(4):
            # 중간에 입력중에 0를 만났을 때 판별하기 위한 boolean
            p1 = False; p2 = False;
            # bfs에서 값을 추가하기전 초기화
            ny = y; nx = x;
            nbby = bby; nbbx = bbx;
            array[ny][nx] = "R"
            array[nbby][nbbx] = "B"
 
            # 최대 10번 값 추가
            for tem in range(10):
                array[ny][nx] = "."
                if array[ny + dy[i]][nx + dx[i]] == "#" or array[ny + dy[i]][nx + dx[i]] == "B":
                    array[ny][nx] = "R"
                elif array[ny + dy[i]][nx + dx[i]] == "O":
                    p1 = True
                else:
                    if not p1:
                        ny += dy[i]; nx += dx[i];
                        array[ny][nx] = "R"
 
                array[nbby][nbbx] = "."
                if array[nbby + dy[i]][nbbx + dx[i]] == "#" or array[nbby + dy[i]][nbbx + dx[i]] == "R":
                    array[nbby][nbbx] = "B"
                elif array[nbby + dy[i]][nbbx + dx[i]] == "O":
                    p2 = True
                else:
                    if not p2:
                        nbby += dy[i]; nbbx += dx[i];
                        array[nbby][nbbx] = "B"
            array[ny][nx] = "."
            array[nbby][nbbx] = "."
            # 이동하지 않았다면 continue
            if not p1 and not p2 and (ny == y and nx == x) and (nbby == bby and nbbx == bbx): continue
            else:
                if p1 and not p2:
                    return n
                elif not p1 and not p2:
                    queue.append((ny, nx, nbby, nbbx, n + 1))
                else:
                    continue
    return 0
 
= bfs(ry, rx, by, bx, 0)
if N > 0:
    print(N)
else:
    print(-1)
cs