알고리즘/DFS,BFS

미로 탈출

Jaden Park 2021. 5. 6. 11:57

문제

철수는 N x M 크기의 직사형 형의 미로에 혀있다.

미로에는 여러마리의 괴물이 있어 이를 해 출해야 한다.

철수의 위치는(1, 1)이고 미로의 출는 (N,M)의 위치에 재하며 한 에 한씩 이동할 수 있다.

이때 괴물이 있는 부분은 0으로 괴물이 는 부분은 1로 시되어 있다.

미로는 반드시 탈할 수 있는 형로 제시다.

이때 철수가 출하기 위해 움직야하는 최소 의 수를 하시오.

을 때는 시작 과 마지막 칸을 모두 해서 계한다.

 

입력 조건

  • 째 에 두 정수 N,M (4≤N,M200)이 주어진다.
  • 다음 N의 에는 각각 M개의 정수 (0 은 1)로 미로의 정가 주어진다.
  • 각각의 수들은 공  붙어서 입력으로 제시다.
  • 한 시작 과 마지막 은 항상 1 이다.

 

출력 조건

  • 첫째 줄에 최소 이동 칸의 개수를 출력한다.

 

입력 예시

5 6
101010
111111
000001
111111
111111

 

출력 예시

10

 

풀이

from collections import deque

n,m = map(int,input().split())
maze = [list(map(int,input())) for _ in range(n)]

dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]

def bfs(x,y):
    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 ny <0 or nx>=n or ny>=m:
                continue
            if maze[nx][ny] == 0:
                continue
            if maze[nx][ny] == 1:
                maze[nx][ny] = maze[x][y] + 1
                queue.append((nx,ny))
    return maze[n-1][m-1]

print(bfs(0,0))

 

문제해설

너비탐색을 생각해야되고 최단 경로의 값들이 1씩 증가하는 형태로 변경하는 것이 포인트이다.

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

[백준], 2606번, 바이러스 (파이썬)  (0) 2021.05.06
[백준], 1260번, DFS와 BFS (파이썬)  (0) 2021.05.06
음료수 얼려 먹기  (0) 2021.05.06
탐색 알고리즘 DFS, BFS  (0) 2021.05.06
재귀 함수 Recursive Fuction  (0) 2021.05.04