BOJ/미해결

BOJ 2206 - 벽 부수고 이동하기

yanJuicy 2024. 9. 16. 14:02
반응형

문제

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

 

 

풀이

BFS를 응용해서 문제를 해결한다

어떤 칸에 도달했을 때, 벽을 부수거나 부수지 않거나 두 가지의 상태가 있다

이것을 다음처럼 표현한다

visited[y][x][벽을 부숨, 벽을 부수지 않음]

visited[y][x][0]=0 # 벽을 부수지 않은 상태, 해당 위치를 방문하지 않은 상태
visited[y][x][0]=1 # 벽을 부수지 않은 상태, 해당 위치를 방문한 상태
visited[y][x][1]=0 # 벽을 부순 상태, 해당 위치를 방문하지 않은 상태
visited[y][x][1]=1 # 벽을 부순 상태, 해당 위치를 방문한 상태

 

또한 최단 거리를 저장하기 위해 visited[y][x][?] 에는 이전 칸에 값 + 1을 해준다

visited[next_y][next_x][?] = visited[y][x][?] + 1

 

이처럼 BFS를 사용하면 n*m 2차원 배열을 탐색하는데 2가지(벽을 부수거나 부수지 않았거나)를 추가해서 시간복잡도는 O(n*m*2)가 된다

 

 

코드

python

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
from collections import deque
 
 
def bfs():
    dy = [1-100]
    dx = [001-1]
    q = deque([[000]])
    visited = [[[0* 2 for _ in range(m)] for _ in range(n)]
    visited[0][0][0= 1
 
    while q:
        y, x, wall = q.popleft()
        if y == n - 1 and x == m - 1:
            return visited[y][x][wall]
 
        for d in range(4):
            next_y = y + dy[d]
            next_x = x + dx[d]
            if (
                0 <= next_y < n
                and 0 <= next_x < m
                and visited[next_y][next_x][wall] == 0
            ):
                if graph[next_y][next_x] == 0:
                    visited[next_y][next_x][wall] = visited[y][x][wall] + 1
                    q.append([next_y, next_x, wall])
                if wall == 0 and graph[next_y][next_x] == 1:
                    visited[next_y][next_x][1= visited[y][x][0+ 1
                    q.append([next_y, next_x, 1])
 
    return -1
 
 
n, m = map(int, input().split())
graph = [list(map(int, input())) for _ in range(n)]
 
print(bfs())
 
cs

 

반응형

'BOJ > 미해결' 카테고리의 다른 글

BOJ 14502 - 연구소  (1) 2024.09.18
BOJ 14888 - 연산자 끼워넣기  (2) 2024.09.14
BOJ 1019 - 책 페이지  (1) 2024.08.28
BOJ 14500 - 테트로미노  (0) 2024.08.27
BOJ 1436 - 영화감독 숌  (0) 2024.08.23