알고리즘/백준
2178번: 미로 탐색
happenundo
2024. 1. 27. 19:21
728x90
2178번: 미로 탐색
첫째 줄에 두 정수 N, M(2 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은 붙어서 입력으로 주어진다.
www.acmicpc.net
BFS로 최단 거리를 탐색하는 문제.
처음에는 단순히 visited배열에 해당 칸 방문 여부만 저장했는데,
거기에 더해 방문하기까지 방문한 칸수를 저장하면 도착지까지의 최단 시간을 구할 수 있다.
풀이 코드
# 2178번: 미로 탐색
from collections import deque
n, m = map(int, input().split())
graph = []
visited = [[0] * m for _ in range(n)] # 현재 칸까지 방문한 칸 수를 저장(0일 경우 방문하지 않은 것)
for i in range(n):
row = list(map(int, input()))
graph.append(row)
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
def bfs(graph, x, y, visited):
queue = deque([(x, y)]) # 시작위치를 큐에 넣고 시작
visited[x][y] = 1
while queue:
x, y = queue.popleft()
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
# 칸을 벗어날 경우 다음으로 넘어감
if nx < 0 or nx >= n or ny < 0 or ny >= m:
continue
# 이동할 수 없는 칸인 경우 다음으로 넘어감
if graph[nx][ny] == 0:
continue
# 이동할 수 있는 칸이고, 방문하지 않은 경우
if graph[nx][ny] == 1 and visited[nx][ny] == 0:
queue.append((nx, ny))
visited[nx][ny] = visited[x][y] + 1
if (nx, ny) == (n - 1, m - 1):
return visited[n-1][m-1]
print(bfs(graph, 0, 0, visited))
...
visited = [[0] * m for _ in range(n)] # 현재 칸까지 방문한 칸 수를 저장(0일 경우 방문하지 않은 것)
...
def bfs(graph, x, y, visited):
...
# 이동할 수 있는 칸이고, 방문하지 않은 경우
if graph[nx][ny] == 1 and visited[nx][ny] == 0:
queue.append((nx, ny))
visited[nx][ny] = visited[x][y] + 1
if (nx, ny) == (n - 1, m - 1):
return visited[n-1][m-1]
이 테크닉을 잘 기억해둬야겠다.
728x90