티스토리 뷰

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

 

2178번: 미로 탐색

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

www.acmicpc.net

보통의 미로탐색의 경우 

아래 코드와 같이 BFS(너비우선탐색, 아직 모른다 하더라도)를 사용하여 푸는데 

검색가능 노드를 찾아 가능한 노드를  q에 쌓으며

해당 q의 유무에 따라  while문을 반복하여 움직인다. 

 

from collections import deque

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

graph = []

for _ in range(N):
  graph.append(list(map(int, input())))

def bfs(x, y):
  # 이동할 네 가지 방향 정의 (상, 하, 좌, 우)
  dx = [-1, 1, 0, 0] 
  dy = [0, 0, -1, 1]

  # deque 생성
  queue = deque()
  queue.append((x, y))

  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:
        graph[nx][ny] = graph[x][y] + 1
        queue.append((nx, ny))
  
  return graph[N-1][M-1]

print(bfs(0, 0))

그러나 우리가 이전에 배웠던 것은 for while 같은 반복문은 재귀를 통해 구현할 수 있기에  해당 while 문을 바꿀 수 있다. 

def recursiveBFS(graph, q, discovered):
    if not q:
        return
        
    v = q.popleft()
    print(v, end=' ')
 
    for u in graph.adjList[v]:
        if not discovered[u]:.
            discovered[u] = True
            q.append(u)

    recursiveBFS(graph, q, discovered)

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함