본문 바로가기
Problem Solving/BOJ

[Python]1261. 알고스팟

by 부르르 2019. 4. 2.

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

 

1261번: 알고스팟

첫째 줄에 미로의 크기를 나타내는 가로 크기 M, 세로 크기 N (1 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 미로의 상태를 나타내는 숫자 0과 1이 주어진다. 0은 빈 방을 의미하고, 1은 벽을 의미한다. (1, 1)과 (N, M)은 항상 뚫려있다.

www.acmicpc.net


이 문제의 경우

주변이 '0' 이면 가중치가 0,

주변이 '1' 이면 가중치가 1이다.

 

따라서 일반적인 Queue를 사용한 BFS는 절대 풀 수 없고

Deque을 이용해서 가중치가 0 일땐 앞에다 추가하고 가중치가 1일땐 뒤에다가 추가해줘야 한다.

 

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
from collections import deque
 
dr = ((-1,0), (1,0), (0,-1), (0,1))
 
def bfs(st_y, st_x, ed_y, ed_x):
    queue = deque()
    queue.append((st_y, st_x))
    check[st_y][st_x] = True
    dist[st_y][st_x] = 0
    while queue:
        curr_y, curr_x = queue.popleft()
        for d in dr:
            next_y = curr_y + d[0]
            next_x = curr_x + d[1]
            if 0<=next_y<=ed_y and 0<=next_x<=ed_x:
                if check[next_y][next_x] == False:
                    if maze[next_y][next_x] == 0:
                        dist[next_y][next_x] = dist[curr_y][curr_x]
                        check[next_y][next_x] = True
                        queue.appendleft((next_y,next_x)) # 가중치가 0 이므로 앞에다 넣어준다.
 
                    else:
                        dist[next_y][next_x] = dist[curr_y][curr_x] + 1
                        check[next_y][next_x] = True
                        queue.append((next_y,next_x)) # 가중치가 1 이므로 뒤에다 넣어준다.
 
n, m = map(int, input().split())
maze = [list(map(int, input())) for _ in range(m)]
check = [[False]*for _ in range(m)]
dist = [[-1]*for _ in range(m)]
bfs(0,0,m-1,n-1)
print(dist[m-1][n-1])
cs
728x90
반응형

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

[Python]1463. 1로 만들기  (0) 2019.04.02
[Python]3055. 탈출  (0) 2019.04.02
[Python]2206. 벽 부수고 이동하기  (0) 2019.04.02
[Python]13549. 숨바꼭질 3  (0) 2019.04.01
[Python]14226. 이모티콘  (0) 2019.04.01

댓글