알고리즘
[C++] 백준 1697번 숨바꼭질
J3SUNG
2019. 8. 25. 16:11
728x90
BFS로 문제를 풀었습니다.
수빈이는 1초에 3가지 행동중 하나를 할 수 있습니다. (X는 현재위치)
1. X = X + 1;
2. X = X - 1;
3. X = X * 2;
이 3가지에 대해서 BFS를 통해서 탐색해나갔고
이미 방문한 곳은 visit배열에 몇초가 걸렸는지를 넣어둠으로서
위치에 대한 방문여부와, 시간을 저장할 수 있었습니다.
동생이 있는 위치를 찾으면 visit[동생위치]를 출력하였으며,
x*2를 했을때 배열을 초과할 수 있기 때문에
동생 위치 * 2 까지만 접근 가능하게 했습니다.
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <queue>
using namespace std;
int N, K;
int visit[200010];
void BFS()
{
int l = N;
queue<int> q;
visit[l] = 0;
q.push(l);
while (!q.empty()) {
l = q.front();
q.pop();
if (l == K) {
cout << visit[K] << endl;
return;
}
if (l + 1 <= K && visit[l + 1] == -1) {
q.push(l + 1);
visit[l + 1] = visit[l] + 1;
}
if (l - 1 >= 0 && visit[l - 1] == -1) {
q.push(l - 1);
visit[l - 1] = visit[l] + 1;
}
if (l * 2 <= K * 2 && visit[l * 2] == -1) {
q.push(l * 2);
visit[l * 2] = visit[l] + 1;
}
}
}
int main(int argc, char *argv[])
{
memset(visit, -1, sizeof(visit));
cin >> N;
cin >> K;
BFS();
return 0;
}