Algorithm
[백준]2178. 미로탐색 - python
우주알
2023. 3. 13. 00:29
https://www.acmicpc.net/problem/2178
2178번: 미로 탐색
첫째 줄에 두 정수 N, M(2 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은 붙어서 입력으로 주어진다.
www.acmicpc.net
- 최단 경로를 찾는거니까 bfs 로 탐색
- 거리를 답으로 출력해야 하므로, 다음 이동할 칸을 찾아 큐에 담을 때 지금까지 온 거리에 +1을 한다
- 방문 표시를 위한 배열을 따로 만들어두고 방문하는 곳은 표시
- 방문한 적 없고 해당 좌표의 숫자가 1이면 (방문표시 하고 그 때까지의 거리를 기록하고, 큐에 담는다)
- 방문한 적 없고 해당 좌표가 N,M(배열 상으로는 N-1,M-1)이면 그 때까지의 거리를 기록하고, 그 값이 곧 답이 된다.
제출 코드>>
from collections import deque
N,M = map(int,input().split())
maze = [list(map(int,input())) for _ in range(N)]
S = (0,0)
E = (N-1,M-1)
visited = [[0]*M for _ in range(N)] # 방문 기록할 곳
delta = [(1,0), (-1,0), (0,1), (0,-1)] # 델타 이동 좌표
ans = 0 # 정답 초기화
visited[S[0]][S[1]] = 1 # 방문 표시
Q = deque([S]) # 큐에 담기
flag = True
while Q: # 큐 있는 동안 계속 탐색
now = Q.popleft()
for k in range(4):
ni = now[0] + delta[k][0]
nj = now[1] + delta[k][1] # 다음 좌표 생성
if 0 <= ni < N and 0 <= nj < M and visited[ni][nj] == 0: # 인덱스를 벗어나지 않고, 방문 안한 곳이면
if (ni,nj) == E: # 그 곳이 마지막 좌표이면
maze[ni][nj] = maze[now[0]][now[1]] + 1 # 거리 기록해주고
ans = maze[ni][nj] # 그 값을 답에 할당한다
elif maze[ni][nj] == 1: # 그 곳이 이동할 수 있는 곳이면
maze[ni][nj] = maze[now[0]][now[1]] + 1 # 거리 기록해주고
visited[ni][nj] = 1 # 방문 표시도 해주고
Q.append((ni,nj)) # 다음에 갈 곳이니까 큐에 담는다
if ans: # 답에 값이 생겼으면 반복문을 완전히 탈출 해야 한다
flag = False
break
if flag == False:
break
print(ans)
풀이과정>>