https://www.acmicpc.net/problem/2178
#Solution
BFS, 그래프의 너비 우선 탐색 방법을 이용해 풀 수 있다. 큐를 이용하는 방법이다.
다음과 같은 알고리즘으로 푼다.
0) 방문한 노드를 담을 visited, 임시적으로 bfs를 돌릴 queue, 해당 노드까지의 거리를 담을 distance 리스트를 만들어준다.
1) maze의 0,0부터 시작해서 상하좌우의 길을 찾아준다.
-이하 반복
2) 현재 노드는 visited에 넣어준다.
3) 현재 노드의 상하좌우에 길이 있을 경우 queue에 넣어주고 해당 노드의 distance에 현재 노드+1을 넣어준다.
4) queue의 맨앞 노드를 pop하여 다음 노드로 사용한다.
5) 출구인 distance[N-1][M-1]의 값을 출력한다.
#BFS로 미로 탈출 알고리즘 정의
def bfs(maze, i, j, N, M):
visited = [] #방문한 노드
queue = [[i, j]] #BFS로 사용될 큐
distance = [[0 for _ in range(M)] for _ in range(N)] #해당 지점까지의 거리를 담는 리스트
distance[0][0] = 1 #첫 시작은 1
while queue:
[i, j] = queue.pop(0) #BFS 큐에 넣어줌
visited.append([i, j]) #방문 리스트에 쌓아줌
#상하좌우 탐색
if i < N-1 and maze[i+1][j] == 1 and [i+1, j] not in visited and [i+1, j] not in queue:
queue.append([i+1, j])
distance[i+1][j] = distance[i][j] + 1
if j < M-1 and maze[i][j+1] == 1 and [i, j+1] not in visited and [i, j+1] not in queue:
queue.append([i, j+1])
distance[i][j+1] = distance[i][j] + 1
if j > 0 and maze[i][j-1] == 1 and [i, j-1] not in visited and [i, j-1] not in queue:
queue.append([i, j-1])
distance[i][j-1] = distance[i][j] + 1
if i > 0 and maze[i-1][j] == 1 and [i-1, j] not in visited and [i-1, j] not in queue:
queue.append([i-1, j])
distance[i-1][j] = distance[i][j] + 1
return distance[N-1][M-1] #마지막 도착지의 거리를 반환
#Input담기
N, M = map(int, input().split())
maze = []
for _ in range(N): #미로를 2차원 배열로 받음
maze.append(list(map(int, str(input()))))
#정답 출력
print(bfs(maze,0,0,N,M))
'Programming [Python] > 백준 알고리즘 솔루션' 카테고리의 다른 글
#165 백준 파이썬 [3046] R2 (0) | 2019.11.05 |
---|---|
#164 백준 파이썬 [1012] 유기농 배추 - BFS (0) | 2019.11.05 |
#162 백준 파이썬 [2667] 단지번호붙이기 - BFS (0) | 2019.11.04 |
#161 백준 파이썬 [1541] 잃어버린 괄호 (0) | 2019.10.31 |
#160 백준 파이썬 [1931] 회의실배정 - 그리디 알고리즘 (0) | 2019.10.31 |