Problem : 벽 부수고 이동하기
유형 : BFS
문제 해석
- 목적지까지 이동하는 최단 경로를 구하라.
- 시작지점 은 항상 {1,1} 이다.
- 이동하는 도중에 한개의 벽을 부실 수 있다.
해결 전략
- 3차원 배열로 관리한다.
[x 좌표][y 좌표][스킬 사용 여부]
- 스킬을 사용할 수 있는 상태에서, 벽을 만난 경우, 스킬을 사용하고 해당 위치로 이동한다.
- 스킬을 사용하지 않은상태와, 사용한 상태를 분리해서 이동시킨다.
- 왜냐하면, 스킬 사용여부에 따라서 경로가 달라지기 때문이다.
설계, 구현
{시작점, 도착점, 스킬사용여부 (0이면 사용X 1이면 사용O)}
를 구조체로 관리한다.- 방문 여부와, 이동거리를 한번에 처리하기 위해서 dist 배열을
-1
로 초기화 한다. - BFS를 진행한다.
- 벽을 만난경우 스킬을 쓸 수 있다면 쓴다.
- 스킬을 사용했으므로 상태 여부를 바꾸어서 계속 탐색시킨다.
- 스킬을 사용하고, 지금까지 왔던 길을 되돌아 갈 수 도 있다.
- 하지만, 해당 방법으로는 절대 최단경로에 도달하지 않으므로 신경쓰지 않아주어도 된다.
- 물론 스킬 사용하기 전까지의 경로를 가지 못하게 처리해주어도 똑같이 답이 나온다.
- 벽을 만난경우 스킬을 쓸 수 있다면 쓴다.
- 정답을 낸다.
주의할 점
- 시작할때의 위치도
1
로 센다.0
스타트가 아니다.
코드
1 |
|
피드백
- BFS 문제도 오랜만에 풀어보니, 생각보다 구현 속도가 빠르게 나오지 않았다.
- 역시 알고리즘은 꾸준히 가 답인것 같다.