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
BFS가 어떻게 진행되는 지 이해해야 풀 수 있는 문제
목표지점까지의 최단 거리를 구하기 위해, 각 지점에서 매번 일반적인 BFS를 수행하게 되면 BFS를 N^2번 수행해야 하므로 시간이 너무 오래 소요된다. 역으로 BFS를 목표지점에서 시작하면 한 번의 BFS로 모든 지점까지의 거리를 계산할 수 있다.
여기까지는 처음 문제를 보자마자 감이 왔는데, 거리 계산을 구현하는 데 애를 먹었다. 고생 끝에 내가 찾은 해답은 다음과 같다. (별거 없긴 함)
동적계획법의 아이디어를 활용한다. 그래프 탐색은 항상 인접한 지점끼리 이뤄지므로, 시작 지점에서 현재 지점까지의 거리를 k라고 하면, 현재 지점에서 BFS를 통해 발견한 새 지점까지의 거리는 반드시 k+1이다.
따라서 일반적인 BFS 코드에서 visited 배열 값 계산만 다음과 같이 구현하면 문제를 해결할 수 있다.
visited[next_row][next_col] = visited[cur_pos.row][cur_pos.col] + 1;
이 방법은 다른 그래프 탐색 문제에서도 자주 사용될 거 같아 익혀두면 좋을 듯 싶다.
배운 내용
2차원 vector 초기화
vector 생성자 ( vector (배열 크기, 초기값) )를 이용한다.
ex) vector arr(row, vector (col, 0)
'백준' 카테고리의 다른 글
백준 7662 - 이중 우선순위 큐 (0) | 2023.07.14 |
---|---|
백준 11723 - 집합 (얌체 풀이) (1) | 2023.07.14 |
백준 18870 - 좌표 압축 (0) | 2023.07.11 |
백준 7576 - 토마토 (0) | 2023.07.06 |
백준 11726 - 2xn 타일링 (0) | 2023.07.05 |