728x90
2178번: 미로 탐색
첫째 줄에 두 정수 N, M(2 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은 붙어서 입력으로 주어진다.
www.acmicpc.net
방해물을 피해 목표 지점까지 가는 가장 빠른 방법을 찾는 문제이다. DFS로 구현했을 때 시간 초과, 이어서 BFS로 구현했을 때에도 큐의 앞에서 요소를 하나씩 빼가며 탐색하는 방법이 아니라 큐를 통째로 탐색 후 새롭게 추가된 큐로 대체하는 방법을 사용했더니 역시 시간 초과가 나왔다. 결국 최초로 방문하는 지점에 인덱스를 저장하는 방식으로 구현, AC를 받았다.
# 빠른 입출력, deque 채택
import sys
from collections import deque
input = sys.stdin.readline
def bfs():
n, m = map(int, input().split())
graph = list()
dx = [0, 0, 1, -1]
dy = [1, -1, 0, 0]
visit = [[False for _ in range(m)] for _ in range(n)]
for _ in range(n):
graph.append(list(map(int, list(input().rstrip()))))
dq = deque()
# x, y 좌표와 해당 좌표까지의 최단 거리 저장
dq.append([0, 0, 1])
visit[0][0] = True
while dq:
x, y, cnt = dq.popleft()
# 목표 지점에 도달하면 return
if x == n - 1 and y == m - 1:
return cnt
# 범위 내에서, 방문하지 않고 방해물이 아닐 때
for (i, j) in zip(dx, dy):
if (0 <= x + i < n) and (0 <= y + j < m):
if not visit[x + i][y + j] and graph[x + i][y + j] == 1:
visit[x + i][y + j] = True
# 다음 좌표와 거기까지의 최단 거리 저장
dq.append([x + i, y + j, cnt + 1])
print(bfs())
728x90
'PS (Problem Solving)' 카테고리의 다른 글
[BOJ, Python] 25682 - 체스판 다시 칠하기 2 ( with DP ) (0) | 2022.11.20 |
---|---|
[BOJ, Python] 비트마스크(BitMask) 정리 ( with 11723 - 집합 ) (0) | 2022.11.14 |
[BOJ, Python] 1759 - 암호 만들기 ( with Backtracking ) (0) | 2022.10.23 |
[BOJ, Python] 2580 - 스도쿠 ( with Backtracking ) (0) | 2022.10.20 |
[BOJ, Python] 9663 - N-Queen ( with Backtracking ) (0) | 2022.10.12 |