알고리즘/Python

[백준] 14940 - 쉬운 최단거리

9__bin 2023. 7. 6. 16:44

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번째 방법: 먼저 그래프에서 목표 지점을 찾고 해당 지점에 대해서 BFS 탐색을 한 뒤 예외처리를 해주었다.

import sys
from collections import deque
n, m = map(int,sys.stdin.readline().split())
graph = []
visited = [[False for i in range(m)] for i in range(n)]

for i in range(n):
    graph.append(list(map(int,sys.stdin.readline().split())))
    
def bfs(x,y):
        graph[x][y] = 0
        visited[x][y] = True
        que = deque()
        que.append((x,y))
        
        dx = [0,0,1,-1]
        dy = [1,-1,0,0]
        
        while que:
            nowx, nowy = que.popleft()
            for i in range(4):
                nextx = nowx + dx[i]
                nexty = nowy + dy[i]
                
                if nextx >= 0 and nexty >= 0 and nextx <= n-1 and nexty <= m-1:
                    if graph[nextx][nexty] !=0 and visited[nextx][nexty] == False:
                        graph[nextx][nexty] = graph[nowx][nowy] + 1
                        visited[nextx][nexty] = True
                        que.append((nextx,nexty))

# 2인 지점 찾기
for i in range(n):
    for j in range(m):
        if graph[i][j] == 2:
            x,y = i,j
bfs(x,y)
# 탐색 후 0이 아니고 아직 방문을 못했다는건 갈 수 없다는 것
for i in range(n):
    for j in range(m):
        if visited[i][j] == False and graph[i][j] != 0:
            graph[i][j] = -1
for i in graph:
    print(*i)