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;
}