본문 바로가기

PS/BaekJoon

[백준/c++] 1697 숨바꼭질

문제

수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때 걷는다면 1초 후에 X-1 또는 X+1로 이동하게 된다. 순간이동을 하는 경우에는 1초 후에 2*X의 위치로 이동하게 된다.

수빈이와 동생의 위치가 주어졌을 때, 수빈이가 동생을 찾을 수 있는 가장 빠른 시간이 몇 초 후인지 구하는 프로그램을 작성하시오.

입력

첫 번째 줄에 수빈이가 있는 위치 N과 동생이 있는 위치 K가 주어진다. N과 K는 정수이다.

출력

수빈이가 동생을 찾는 가장 빠른 시간을 출력한다.

구현해야할 조건

BFS이동으로 생각해서 문제를 해결하면 되는데, x+1, x-1, x*2에 관한 이동을 하면 된다. 단 x-1 >= 0과 같은 범위를 꼭 지정해주어야 범위를 벗어나지 않는다. n과 k는 정수이기 때문에! 

 

#include<iostream>
#include<queue>

#define MAX 100001
using namespace std;

bool visited[MAX];

int BFS(int n, int k)
{
	queue<pair<int,int> > q;
	q.push({n,0});
	
	visited[n] = true;
	
	while(!q.empty())
	{
		int location = q.front().first;
		int sec = q.front().second;
		q.pop();
		
		if(location == k)
			return sec;
			
		if(location + 1 < MAX && !visited[location+1]) // x + 1 < MAX
		{
			q.push({location+1, sec+1});
			visited[location+1] = true;
		}
		
		if(location - 1 >= 0 && !visited[location - 1]) // x - 1 >= 0
		{
			q.push({location - 1, sec+1});
			visited[location - 1] = true;
		}
		
		if(location * 2 < MAX && !visited[location * 2]) // x * 2 < MAX
		{
			q.push({location * 2, sec + 1});
			visited[location*2] = true;
		}
	}
	
}

int main()
{
	int n,k;
	cin >> n >> k;
	
	cout << BFS(n,k) << "\n";
	
	return 0;
}

'PS > BaekJoon' 카테고리의 다른 글

[백준/c++] 16927 배열 돌리기 2  (0) 2022.03.10
[백준/c++] 16926 배열 돌리기 1  (0) 2022.03.10
[백준/c++] 7576 토마토  (0) 2022.03.09
[백준/c++] 2667 단지번호붙이기  (0) 2022.03.09
[백준/c++] 13023 ABCDE  (0) 2022.03.09