1697 숨바꼭질
문제 해석
수빈이가 동생을 찾아가는데 몇초만에 찾는지 알아내는 문제입니다. 수빈이와 동생은 점 0~100000사이에 있습니다. 근데 왜 수빈이만 동생을 찾는 건지는 이해가 가지 않는군요.
수빈이는 다음과 같은 이상한 능력이 있습니다.
1. 수빈이가 위치 X에 있을때 1초에 X+1, X-1의 위치로 걸을 수 있습니다. 물론 범위 0~100000의 범위 안에서만 말이죠.
2. 수빈이는 순간이동을 할 수 있는데, 현재 위치 X에서 1초만에 X*2의 위치로 이동할 수 있습니다.
두개의 입력이 주어지는데, 가장 첫번째 입력은 수빈이의 위치, 두번째 입력은 동생의 위치입니다.
5와 17이라는 입력이 주어진다면 답은 4가 됩니다. 5->10->9->18->17로 찾을 수 있습니다.
이런 조건 속에서 몇 초만에 동생을 찾을 수 있을까요?
풀이
BFS(Breadth First Search)를 이용하면 이 문제를 풀 수 있습니다. 그 때문에 큐(Queue)를 이용해야합니다. 수빈이가 있는 점을 start라고 하고 동생이 있는 위치를 end라고 합시다. 결국 우리가 구현해야하는 것은 start에서부터 BFS를 통해 end까지 도달을 몇번에 할 수 있는가입니다.
아래의 전체적인 코드를 우선 보고 설명하도록 하겠습니다.
#include <cstdio> #include <queue> using namespace std; #define MAX_N 100001 #define LIMIT 100000 int bfs(int start, int end) { if (start==end) return 0; queue<int> q; q.push(start); int length[MAX_N] = { 0, }; while (!q.empty()) { int here = q.front(); q.pop(); if (here + 1 <= LIMIT) { if (here + 1 == end) return length[here] + 1; if (!length[here + 1]) { length[here + 1] = length[here] + 1; q.push(here + 1); } } if (here - 1 >= 0) { if (here - 1 == end) return length[here] + 1; if (!length[here - 1]) { length[here - 1] = length[here] + 1; q.push(here - 1); } } if (here * 2 <= LIMIT) { if (here * 2 == end) return length[here] + 1; if (!length[here * 2]) { length[here * 2] = length[here] + 1; q.push(here * 2); } } } return -1; } int main() { int start, end; scanf("%d %d", &start, &end); printf("%d\n", bfs(start, end)); return 0; }
'알고리즘 > BFS' 카테고리의 다른 글
[알고리즘] 백준 온라인 저지 BOJ 2178 미로탐색 (0) | 2018.09.24 |
---|---|
[알고리즘 : 그래프 이론] 그림으로 보는 BFS 기본, 개념, 설명 (0) | 2018.09.16 |