알고리즘/BFS,DFS

미로찾기 (BFS)- 백준 2178번

jwjwvison 2022. 6. 2. 11:32

출처:

https://www.acmicpc.net/problem/2178

 

2178번: 미로 탐색

첫째 줄에 두 정수 N, M(2 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은 붙어서 입력으로 주어진다.

www.acmicpc.net

 

 위 문제는 기본적인 최단거리 찾기 문제이다. 나는 처음에 DFS로 접근해서 답이 나오지 않았다. 이 문제는 BFS로 풀어야 한다.

import collections

N,M=map(int,input().split())

q=collections.deque()
q.append((0,0))

m=[]
for _ in range(N):
    m.append(list(map(int,input())))
    
arr=[0]*M
visited=[]
for _ in range(N):
    visited.append(arr.copy())
    
visited[0][0]=1

dxy=[(-1,0),(1,0),(0,1),(0,-1)]

 우선 기본적인 문제 세팅을 해준다. 여기서는 dxy 리스트로 현재 위치 지점 m[i][j]에서 상하좌우 좌표 x,y를 구한후 m[x][y]가 1이고(길이 있고) visited[x][y]가 0(방문하지 않았던 지점)이면 visited[x][y]를 visited[i][j]+1 로 값을 바꿔준다.

 

 전체적인 흐름은 현재 위치에서 상하좌우 좌표를 확인하고 그 값들중 조건에 맞는 좌표를 q에 추가한다. 그리고 현재 위치의 상하좌우를 다 확인했으면 q에 추가된 좌표들중 먼저 추가된 순서대로 가서 그 좌표에서 또 상하좌우를 탐색한다.

while q:
    i,j=q.popleft()
    
    for dx,dy in dxy:
        x=i+dx
        y=j+dy
        
        if 0<=x<N and 0<=y<M:
            if m[x][y]==1 and visited[x][y]==0:
                visited[x][y] = visited[i][j] + 1
                q.append((x,y))

 

1) bfs로 풀이시 visited 리스트

2) dfs로 풀이시 visited 리스트

 

'알고리즘 > BFS,DFS' 카테고리의 다른 글

BFS의 우선탐색 (appendleft 로 우선탐색후 조건 탐색) - 백준 1261  (0) 2022.09.14
19.DFS-조합  (0) 2021.09.05
18.DFS - 순열  (0) 2021.09.05
17. 그래프 순회 - 섬의 개수  (0) 2021.09.01
16. 그래프 순회- BFS, DFS  (0) 2021.08.31