티스토리 뷰
728x90
https://www.acmicpc.net/problem/2178
2178번: 미로 탐색
첫째 줄에 두 정수 N, M(2 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은 붙어서 입력으로 주어진다.
www.acmicpc.net
- 해설 :
N×M크기의 배열로 표현되는 미로가 있다.
1 | 0 | 1 | 1 | 1 | 1 |
1 | 0 | 1 | 0 | 1 | 0 |
1 | 0 | 1 | 0 | 1 | 1 |
1 | 1 | 1 | 0 | 1 | 1 |
미로에서 1은 이동할 수 있는 칸을 나타내고, 0은 이동할 수 없는 칸을 나타낸다. 이러한 미로가 주어졌을 때, (1, 1)에서 출발하여 (N, M)의 위치로 이동할 때 지나야 하는 최소의 칸 수를 구하는 문제이다.
위의 예에서는 15칸을 지나야 (N, M)의 위치로 이동할 수 있다. 칸을 셀 때에는 시작 위치와 도착 위치도 포함한다.
- 풀이 :
기본적인 BFS, DFS 문제이다. 인접한 칸들에 대해 매 번 min 값으로 초기화하며 끝까지 탐색을 진행하면 된다.
- 소스코드 :
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
|
dx = [0, 0, -1, 1]
dy = [-1, 1, 0, 0]
def bfs(x,y):
queue = [[x,y]]
while queue:
ax,ay = queue[0]
del queue[0]
for i in range(4):
bx = ax + dy[i]
by = ay + dx[i]
if 0<=bx<N and 0<=by<M:
if maze[bx][by] == '1':
maze[bx][by] = maze[ax][ay]+1
queue.append([bx,by])
if __name__ == "__main__":
N,M = map(int,input().split())
maze = []
for _ in range(N):
maze.append(list(input()))
maze[0][0] = 1
bfs(0,0)
print(maze[N-1][M-1])
|
cs |
320x100
'Algorithm > DFS & BFS' 카테고리의 다른 글
(Python) - BOJ(2589번) : 보물섬 (0) | 2022.01.31 |
---|---|
(Python) - BOJ(2468번) : 안전 영역 (0) | 2022.01.31 |
(Python) - BOJ(1987번) : 알파벳 (0) | 2022.01.30 |
(Python) - BOJ(1389번) : 케빈 베이컨의 6단계 법칙 (0) | 2022.01.26 |
(Python) - BOJ(1303번) : 전투 (0) | 2022.01.26 |
댓글
© 2022 WonSeok, All rights reserved