본문 바로가기
Problem Solving/BOJ

[Python]3055. 탈출

by 부르르 2019. 4. 2.

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

 

3055번: 탈출

문제 사악한 암흑의 군주 이민혁은 드디어 마법 구슬을 손에 넣었고, 그 능력을 실험해보기 위해 근처의 티떱숲에 홍수를 일으키려고 한다. 이 숲에는 고슴도치가 한 마리 살고 있다. 고슴도치는 제일 친한 친구인 비버의 굴로 가능한 빨리 도망가 홍수를 피하려고 한다. 티떱숲의 지도는 R행 C열로 이루어져 있다. 비어있는 곳은 '.'로 표시되어 있고, 물이 차있는 지역은 '*', 돌은 'X'로 표시되어 있다. 비버의 굴은 'D'로, 고슴도치의 위치는 'S'로 나

www.acmicpc.net


 

물이 미리 차오르는 시간을 구한다음, 고슴도치를 움직이도록 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
from collections import deque
 
def bfs(lst):
    global row, col
    queue = deque()
    for i in lst:
        queue.append(i)
        flooding_time[i[1]][i[2]] = 0
 
    while queue:
        cha, curr_y, curr_x = queue.popleft()
        for d in dr:
            next_y, next_x = curr_y+d[0], curr_x+d[1]
            if 0<=next_y<row and 0<=next_x<col:
                if cha == '*'# 물이 queue에 있을 때
                    if MAP[next_y][next_x] == '.' and flooding_time[next_y][next_x] == -1:
                        flooding_time[next_y][next_x] = flooding_time[curr_y][curr_x]+1
                        queue.append(('*', next_y, next_x))
                else# 고슴도치가 queue에 있을 때
                    if (flooding_time[curr_y][curr_x]+1 < flooding_time[next_y][next_x]) or (flooding_time[next_y][next_x]==-1 and MAP[next_y][next_x] == '.'):
                        flooding_time[next_y][next_x] = flooding_time[curr_y][curr_x] + 1
                        queue.append(('S', next_y, next_x))
                    
                    # 고슴도치가 이동하다가 'D'에 도달하면
                    if MAP[next_y][next_x] == 'D' and flooding_time[next_y][next_x] == -1:
                        flooding_time[next_y][next_x] = flooding_time[curr_y][curr_x] + 1
                        return
 
dr = ((-10), (10), (0-1), (01))
row, col = map(int, input().split())
MAP = [list(input()) for _ in range(row)]
dic = {'D':[], 'S':[], '*':[]}
 
# D, S, * 의 위치를 찾아서 딕셔너리에 저장한다.
for r in range(row):
    for c in range(col):
        if MAP[r][c] == 'D':
            dic['D'].append((r, c))
        if MAP[r][c] == 'S':
            dic['S'].append(('S', r, c))
        if MAP[r][c] == '*':
            dic['*'].append(('*', r, c))
 
# 물이 차오르는 시간 계산
flooding_time = [[-1]*col for _ in range(row)]
 
bfs(dic['*'])
bfs(dic['S'])
 
if flooding_time[dic['D'][0][0]][dic['D'][0][1]] == -1:
    print('KAKTUS')
else:
    print(flooding_time[dic['D'][0][0]][dic['D'][0][1]])
 
'''
# input
10 15
........X......
..XXXXX.X.*....
X.....X.X..*...
.X.S..X.X......
D.X...X.XXXXXXX
.X....X........
.X....X.XXXXXXX
.XXXXXX.X......
........X......
XXXXXXXXX...*..
# output
30
'''
cs
728x90
반응형

'Problem Solving > BOJ' 카테고리의 다른 글

[Python]16194. 카드 구매하기 2  (0) 2019.04.03
[Python]1463. 1로 만들기  (0) 2019.04.02
[Python]2206. 벽 부수고 이동하기  (0) 2019.04.02
[Python]1261. 알고스팟  (0) 2019.04.02
[Python]13549. 숨바꼭질 3  (0) 2019.04.01

댓글