https://www.acmicpc.net/problem/13460
import sys
from collections import deque
import copy
dy = [1, 0, -1, 0]
dx = [0, 1, 0, -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 > 10: return 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
N = bfs(ry, rx, by, bx, 0)
if N > 0:
print(N)
else:
print(-1)
|
cs |
'백준(Python) > 골드' 카테고리의 다른 글
백준 17141: 연구소 2 [Python] (0) | 2022.06.21 |
---|---|
백준 15927: 회문은 회문아니야!! [파이썬] (0) | 2022.06.03 |
[Python] 백준 1520번 - 내리막 길, 다이나믹 프로그래밍-기초 (0) | 2022.05.26 |