알고리즘/백준

[BOJ#14940] 쉬운 최단거리

Jinoo.keem 2024. 3. 24. 21:33
728x90

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

1 초 128 MB 24574 9715 7918 37.132%

문제

지도가 주어지면 모든 지점에 대해서 목표지점까지의 거리를 구하여라.

문제를 쉽게 만들기 위해 오직 가로와 세로로만 움직일 수 있다고 하자.

입력

지도의 크기 n과 m이 주어진다. n은 세로의 크기, m은 가로의 크기다.(2 ≤ n ≤ 1000, 2 ≤ m ≤ 1000)

다음 n개의 줄에 m개의 숫자가 주어진다. 0은 갈 수 없는 땅이고 1은 갈 수 있는 땅, 2는 목표지점이다. 입력에서 2는 단 한개이다.

출력

각 지점에서 목표지점까지의 거리를 출력한다. 원래 갈 수 없는 땅인 위치는 0을 출력하고, 원래 갈 수 있는 땅인 부분 중에서 도달할 수 없는 위치는 -1을 출력한다.


제출 코드

import sys
from collections import deque
input = sys.stdin.readline

di = [0, 0, 1, -1]
dj = [1, -1, 0, 0]

def bfs(si, sj):
    visited[si][sj] = True
    q = deque()
    q.append([si, sj])
    while q:
        ci, cj = q.popleft()
        for k in range(4):
            ni = ci + di[k]
            nj = cj + dj[k]
            if 0 <= ni < N and 0 <= nj < M and not visited[ni][nj] and arr[ni][nj] != 0:
                visited[ni][nj] = True
                cnt[ni][nj] = cnt[ci][cj] + 1
                q.append([ni, nj])
        

N, M = map(int, input().split())
arr = [list(map(int, input().split())) for _ in range(N)]
visited = [[False] * M for _ in range(N)]
cnt = [[0] * M for _ in range(N)]

for i in range(N):
    for j in range(M):
        if arr[i][j] == 2:
            bfs(i, j) # 갈 수 있는 땅 체크
            
for i in range(N):
    for j in range(M):
        if not visited[i][j] and arr[i][j] == 1:
            cnt[i][j] = -1
for line in cnt:
    print(*line)

그래프 실버 1까지는 무난하게 풀게된 것 같다. 기계적으로 코드를 적어서 공부가 됐는지 모르겠다..

다 풀어놓고 언팩을 안해서 틀려버린

'알고리즘 > 백준' 카테고리의 다른 글

[BOJ#12789] 도키도키 간식드리미  (0) 2024.03.30
[BOJ#9934] 완전 이진 트리  (0) 2024.03.27
[BOJ#16928] 뱀과 사다리 게임  (0) 2024.03.24
[BOJ#7576] 토마토  (1) 2024.03.24
[BOJ#2583] 영역 구하기  (0) 2024.03.23