끄적끄적
백준 2206 [벽 부수고 이동하기] -BFS 본문
출처 : https://www.acmicpc.net/problem/2206
2206번: 벽 부수고 이동하기
N×M의 행렬로 표현되는 맵이 있다. 맵에서 0은 이동할 수 있는 곳을 나타내고, 1은 이동할 수 없는 벽이 있는 곳을 나타낸다. 당신은 (1, 1)에서 (N, M)의 위치까지 이동하려 하는데, 이때 최단 경로
www.acmicpc.net
벽 부수고 이동하기
2 초 | 192 MB | 65551 | 16391 | 10133 | 22.743% |
문제
N×M의 행렬로 표현되는 맵이 있다. 맵에서 0은 이동할 수 있는 곳을 나타내고, 1은 이동할 수 없는 벽이 있는 곳을 나타낸다. 당신은 (1, 1)에서 (N, M)의 위치까지 이동하려 하는데, 이때 최단 경로로 이동하려 한다. 최단경로는 맵에서 가장 적은 개수의 칸을 지나는 경로를 말하는데, 이때 시작하는 칸과 끝나는 칸도 포함해서 센다.
만약에 이동하는 도중에 한 개의 벽을 부수고 이동하는 것이 좀 더 경로가 짧아진다면, 벽을 한 개 까지 부수고 이동하여도 된다.
한 칸에서 이동할 수 있는 칸은 상하좌우로 인접한 칸이다.
맵이 주어졌을 때, 최단 경로를 구해 내는 프로그램을 작성하시오.
입력
첫째 줄에 N(1 ≤ N ≤ 1,000), M(1 ≤ M ≤ 1,000)이 주어진다. 다음 N개의 줄에 M개의 숫자로 맵이 주어진다. (1, 1)과 (N, M)은 항상 0이라고 가정하자.
출력
첫째 줄에 최단 거리를 출력한다. 불가능할 때는 -1을 출력한다.
예제 입력 1
6 4
0100
1110
1000
0000
0111
0000
예제 출력 1
15
최단 거리 - BFS
벽을 하나 뚫을 수 있다는 조건은 visited 배열로 관리. 0이면 아직 안뚫은거고 1이면 이미 뚫은 것.
똑같은 좌표라도 벽을 뚫은 것의 여부에 따라 달라진다.
각 좌표의 최단거리 저장은 result 배열로 관리해주었다.
도착 지점에 도착했을 경우에는 arrive를 true로 만들어주고 return해주었다.
** 도착하지 못했을 경우 무조건 -1 출력이 아니라 1x1의 경우도 있으므로 예외 관리를 해주어야 한다.
예외 처리를 해주지 않을 경우 틀리게 되는데, 이유는 bfs로 들어가서 for문을 돌아야 arrive가 true가 되는데, 1x1의 경우 다음칸이 없기 때문에 arrive가 true가 되지 못하므로 저렇게 예외처리를 해줘야 한다.
if (N == 1 && M == 1)
cout << 1 << '\n';
'코테준비' 카테고리의 다른 글
백준 11727 [2xn 타일링 2] -dp (0) | 2021.09.27 |
---|---|
백준 11726 [2×n 타일링] -dp (0) | 2021.09.27 |
백준 2579 [계단 오르기] - DP (0) | 2021.09.23 |
백준 [15683] 감시 - 완전탐색 (0) | 2021.09.18 |
백준 [14502] 연구소 -BFS, BruteForce (0) | 2021.09.16 |