Algorithm(BOJ, Python)/BFS&DFS

[백준_2178] 미로탐색 python

kurooru 2022. 8. 12. 14:32

경로를 찾는 데에 bfs를 사용하든 dfs를 사용하든 자기 맘이다.

더 자신있는 것을 사용하는 쪽이 좋다.

그러나 최소 경로를 찾을 때에는 bfs를 사용해야 한다.

# n, m 입력
n, m = map(int, input().split())

# maze
maze = [
    [0] * m
    for _ in range(n)
]

# maze 채우기
for i in range(n):
    # block 입력받기
    block = input()
    for j in range(len(block)):
        # 이동할 수 있는 칸은
        if block[j] == '1':
            # 1로 표시
            maze[i][j] = 1

# visited
visited = [
    [0] * m
    for _ in range(n)
]

# step
step = [
    [0] * m
    for _ in range(n)
]

# step 첫번째 칸 1로 설정
step[0][0] = 1

# in_range(x,y)
def in_range(x,y):
    return 0 <= x and x < n and 0 <= y and y < m

# check(x, y)
def check(x, y):
    # 범위 내에 있고, 방문한 적 없고, 벽이 아니면 통과
    return in_range(x, y) and not visited[x][y] and maze[x][y]

# bfs()
def bfs():
    # 큐 안에 원소가 없을 때 까지 반복
    while q:
        
        # 언팩킹
        x, y = q.popleft()

        # dxs, dys -> 상 하 좌 우 순서 상관 x
        dxs, dys = [-1, 1, 0, 0], [0, 0, -1, 1]
        
        for dx, dy in zip(dxs, dys):
            # 다음 조사 위치
            nx, ny = x + dx, y + dy
            # 그 위치가 갈 수 있으면
            if check(nx, ny):
                # 방문 위치 남겨주고
                visited[nx][ny] = 1
                # 큐에 넣어주고
                q.append((nx, ny))
                # step에 이동 횟수 기록
                step[nx][ny] = step[x][y] + 1 

# 설계
from collections import deque

# q
q = deque()

# 방문흔적 남기고
visited[0][0] = 1
# 큐에 넣어주고
q.append((0, 0))
# bfs 돌려주기
bfs()

# 출력
print(step[-1][-1])