Notice
Recent Posts
Recent Comments
Link
«   2025/03   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
Tags
more
Archives
Today
Total
관리 메뉴

끄적끄적

백준 2206 [벽 부수고 이동하기] -BFS 본문

코테준비

백준 2206 [벽 부수고 이동하기] -BFS

alstj_성공 2021. 9. 23. 14:58

출처 : 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';