문제
철수는 N x M 크기의 직사각형 형태의 미로에 갇혀있다.
미로에는 여러마리의 괴물이 있어 이를 피해 탈출해야 한다.
철수의 위치는(1, 1)이고 미로의 출구는 (N,M)의 위치에 존재하며 한 번에 한칸씩 이동할 수 있다.
이때 괴물이 있는 부분은 0으로 괴물이 없는 부분은 1로 표시되어 있다.
미로는 반드시 탈출할 수 있는 형태로 제시된다.
이때 철수가 탈출하기 위해 움직여야하는 최소 칸의 개수를 구하시오.
칸을 셀때는 시작 칸과 마지막 칸을 모두 포함해서 계산한다.
입력 조건
- 첫째 줄에 두 정수 N,M (4≤N,M≤200)이 주어진다.
- 다음 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 |