Skip to content

Commit 00f61e4

Browse files
committed
[BOJ]#13460. 구슬탈출2/ Gold1/ 실패
https://www.acmicpc.net/problem/13460
1 parent 8ab447e commit 00f61e4

File tree

1 file changed

+85
-0
lines changed

1 file changed

+85
-0
lines changed

Hongjoo/백준/구슬탈출2.py

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
from collections import deque
2+
import sys
3+
"""
4+
1. 초기화
5+
- R,B 의 위치 좌표
6+
- 방문 등록
7+
2. queue
8+
3. 4방위
9+
-> 파란 구술 구멍 -> 실패
10+
-> 빨간 구술 구멍 -> 성공
11+
-> 둘이 같은 위치=>
12+
"""
13+
14+
n, m = map(int, sys.stdin.readline().split())
15+
board = [list(input().rstrip()) for _ in range(n)]
16+
visited = []
17+
18+
# 우,좌,하,상
19+
dx = [1 ,-1 , 0 ,0]
20+
dy = [0,0,-1,1]
21+
22+
def get_RB_position(): # Red , Blue
23+
rx ,ry, bx , by = 0 , 0, 0, 0
24+
for i in range(n):
25+
for j in range(m):
26+
if board[i][j] == "R" :
27+
rx , ry = i, j
28+
elif board[i][j] == "B":
29+
bx , by = i , j
30+
31+
return rx ,ry, bx , by
32+
33+
def move(x,y, dx , dy) :
34+
# 벽 또는 구멍까지 이동
35+
# dx ,dy : 방향
36+
shift_cnt = 0
37+
while board[x + dx][y+dy] != "#" and board[x][y] != "O":
38+
x += dx
39+
y+= dy
40+
shift_cnt +=1
41+
42+
return x ,y, shift_cnt
43+
44+
45+
def bfs() :
46+
#1. 초기화
47+
rx , ry , bx , by = get_RB_position()
48+
queue = deque()
49+
queue.append((rx,ry, bx , by, 1)) # red 좌표 , blue 좌표 , 횟수
50+
visited.append((rx,ry , bx,by))
51+
52+
while queue :
53+
rx,ry,bx,by,result= queue.popleft()
54+
# 10회 초과해도 안나오면 -1 반환
55+
if result > 10 :
56+
57+
break
58+
59+
for i in range(4): #
60+
crx , cry , r_shift = move(rx ,ry , dx[i], dy[i])
61+
cbx , cby , b_shift = move(bx ,by, dx[i], dy[i])
62+
63+
# 만약 파란공이 구멍에 들어가면 실패
64+
if board[cbx][cby] == "O" :
65+
continue
66+
# 만약 빨간 공이 구멍에 들어가면 성공
67+
if board[crx][cry] == "O" :
68+
print(result)
69+
return 0
70+
# 만약 두 공이 겹치면 -> 더 많이 이동한 공이 더 전에 있음
71+
if cbx == crx and cry == cby :
72+
if r_shift > b_shift : # red 가 더 멀리 있음
73+
crx -=dx[i]
74+
cry -= dy[i]
75+
else :
76+
cbx -=dx[i]
77+
cby -= dy[i]
78+
# 처음 도착한 칸인 경우
79+
if (crx , cry , cbx, cby) not in visited :
80+
visited.append((crx , cry , cbx, cby))
81+
queue.append((crx , cry , cbx, cby , result +1))
82+
print(-1)
83+
84+
bfs()
85+

0 commit comments

Comments
 (0)