반응형
https://www.acmicpc.net/problem/14940
14940번: 쉬운 최단거리
지도의 크기 n과 m이 주어진다. n은 세로의 크기, m은 가로의 크기다.(2 ≤ n ≤ 1000, 2 ≤ m ≤ 1000) 다음 n개의 줄에 m개의 숫자가 주어진다. 0은 갈 수 없는 땅이고 1은 갈 수 있는 땅, 2는 목표지점이
www.acmicpc.net
from collections import deque
import sys
ssr = sys.stdin.readline
def get_pos():
for i in range(n):
for j in range(m):
if board[i][j] == 2:
visited[i][j] = 0
q.append((i, j, 0))
elif board[i][j] == 0:
visited[i][j] = 0
def bfs():
while q:
r, c, d = q.popleft()
if 0 <= r-1:
if visited[r-1][c] == -1:
if board[r-1][c] == 1:
visited[r-1][c] = d+1
q.append((r-1, c, d+1))
else:
visited[r-1][c] = 0
if 0 <= c-1:
if visited[r][c-1] == -1:
if board[r][c-1] == 1:
visited[r][c-1] = d+1
q.append((r, c-1, d+1))
else:
visited[r][c-1] = 0
if r+1 < n:
if visited[r+1][c] == -1:
if board[r+1][c] == 1:
visited[r+1][c] = d+1
q.append((r+1, c, d+1))
else:
visited[r+1][c] = 0
if c+1 < m:
if visited[r][c+1] == -1:
if board[r][c+1] == 1:
visited[r][c+1] = d+1
q.append((r, c+1, d+1))
else:
visited[r][c+1] = 0
n, m = map(int, ssr().split())
visited = [[-1 for _ in range(m)] for _ in range(n)]
board = [list(map(int, ssr().split())) for _ in range(n)]
q = deque([])
get_pos()
bfs()
for i in visited:
print(*i)
별로 어렵지 않은 bfs 문제입니다. 신경 써볼만한 부분은 원래 갈 수 있는 곳이지만 갈 수 없게 됐을 경우 -1을 해줘야 한다는 부분일까요.
bfs 부분의 코드가 매우 길어지기 때문에 반복문을 사용해서 좀 더 줄여볼 수도 있겠네요.
반응형
'Problem Solving > BOJ' 카테고리의 다른 글
[BOJ][Python]21736 풀이 (0) | 2023.07.24 |
---|---|
[BOJ][Python]20529 풀이 (0) | 2023.07.23 |
[BOJ][Python]18110 풀이 (0) | 2023.07.20 |
[BOJ][Python]1283 풀이 (0) | 2023.07.20 |