728x90
- 회색은 땅, 하얀색은 바다. 땅간의 연결 가능한 최단거리를 구하시오.
반례모음
5 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 2 |
5 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 |
6 1 0 0 1 1 1 1 0 0 0 0 1 1 0 0 0 0 0 1 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 1 |
5 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 1 2 |
4 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 4 |
풀이
- 풀이가 2가지 있습니다.
- 1) BFS기반 정석적인 풀이
- 땅의 영역을 BFS를 통해서 찾고, 각 땅의 영역에서 BFS로 다른 땅의 영역을 찾습니다.
- 먼저 다른 땅에 도달했을 때, 최단경로입니다.
- 간단해보이지만, 다른 땅에 도달하도록 BFS를 구성할 때, 조건문이 까다롭습니다.
- 그러나, 속도가 매우 빠릅니다. 4ms - 2) BFS + 좌표기반 거리 구하기
- 땅의 영역을 BFS로 찾는 것은 동일합니다.
단, 땅의 좌표(x,y)를 모두 저장하고, 동시에 땅의 번호도 함께 저장합니다.
- 구한 좌표들을 다른 땅들간에 거리를 구해줍니다. (x,y)를 알기 때문에 손쉽게 가로 몇칸 세로 몇칸을 구할 수 있습니다. 가장 작은 거리를 출력합니다.
- 속도가 조금 느립니다. 48ms
- 그러나, 까다로운 조건문이 없기 때문에 직관적이며 실수할 확률이 적습니다. - 저는 2)번 방법으로 풀이하였습니다.
코드
알게 된 점
- BFS는 속도는 빠르지만 조건문이 너무 까다로운 것 같다. 생각해줘야 할게 많음. 이론적으로는 납득이 쉽고 이해가 가지만 코드로 세세하게 구현이 필요하다.
git 코드
728x90
'C++ > 백준 BFS' 카테고리의 다른 글
[c++] 백준 말이 되고픈 원숭이(1600), bfs, 반례모음 (4) | 2023.08.16 |
---|---|
[c++] 백준 숨바꼭질 3(13549), bfs, 반례모음 (0) | 2023.08.16 |
[c++] 백준 빙산(2573), BFS, 반례모음 (2) | 2023.08.07 |
[c++] 백준 텀프로젝트(9466), BFS, 반례추가 (4) | 2023.08.01 |
[c++] 백준 벽 부수고 이동하기(2206), BFS (0) | 2023.07.29 |