Algorithm/백준
[백준][1697] 숨바꼭질
1일1코딩
2020. 4. 2. 22:21
https://www.acmicpc.net/problem/1697
1697번: 숨바꼭질
문제 수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때 걷는다면 1초 후에 X-1 또는 X+1로 이동하게 된다. 순간이동을 하는 경우에는 1초 후에 2*X의 위치로 이동하게 된다. 수빈이와 동생의 위치가 주어졌을 때, 수빈이가 동생을 찾을 수 있는 가장 빠른 시간이 몇 초 후인지
www.acmicpc.net
풀이과정
1. x + 1, x -1, x *2의 이동방향을 가지는 주인공이 도착지에 도착하는 가장 빠른 길이를 구하는 문제이다.
2. bfs를 통하여 문제를 풀었다.
3. que를 비워줄때 마다 step이 증가하고 최초로 visited[목적지]를 방문하는 step이 정답이 된다.
소스코드
더보기
#include <stdio.h>
#include <algorithm>
#include <queue>
#include <string.h>
#define MAX_VAL 100001
using namespace std;
int x, y;
int visited[100001];
int step = 0;
int solution()
{
queue<int> que;
que.push(x);
visited[x] = 1;
int count = 0;
while (!que.empty()) {
int queSize = que.size();
count++;
if (visited[y] != 0) {
break;
}
for (int i = 0; i < queSize; i++) {
int cur = que.front(); que.pop();
if (cur + 1 < MAX_VAL && visited[cur + 1] == 0) {
visited[cur + 1] = count;
que.push(cur + 1);
}
if (cur * 2 < MAX_VAL && visited[cur * 2] == 0) {
visited[cur * 2] = count;
que.push(cur * 2);
}
if (cur - 1 >= 0 && visited[cur - 1] == 0) {
visited[cur - 1] = count;
que.push(cur - 1);
}
}
}
return visited[y];
}
int main()
{
scanf("%d %d", &x, &y);
if (x == y) {
printf("0\n");
}
else {
printf("%d\n", solution());
}
return 0;
}