[백준 1697번 C/C++] 숨바꼭질

 

https://www.acmicpc.net/problem/1697

 

1697번: 숨바꼭질

수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일

www.acmicpc.net


 

 

해결전략

 

너비우선탐색, BFS

 


 

코드

 

#include <iostream>
#include <vector>
#include <queue>
using namespace std;

int n, k; //n: 수빈 현재 점, k: 동생 점
queue<pair<int,int>> Q; // 첫 번째 원소는 위치, 두 번째 원소는 해당 위치에 도달하기까지 걸린 시간
vector<int> ch; //해당 위치를 방문했는지 여부를 체크

int minSec = 2147000000;

void BFS(int n, int k)
{
	//시작점인 수빈이의 위치와 초(sec)를 삽입하고 방문 처리
	Q.push({ n, 0 });
	ch[n] = 1;

	while (!Q.empty())
	{
		int x = Q.front().first;
		int sec = Q.front().second;
		Q.pop();

		//현재 위치가 목표인 동생의 위치와 같다면 지금까지 걸린 시간(sec)을 출력하고 함수를 종료
		if (x == k){
			cout << sec;
			return;
		}

		if (ch[x-1]==0 && 0 < x-1)
		{
			Q.push({ x - 1, sec + 1 });
			ch[x - 1] = 1;
		}
		if (ch[x+1]==0 && x+1 < k * 2)
		{
			Q.push({ x + 1, sec + 1 });
			ch[x + 1] = 1;
		}
		if (ch[x*2]==0 && x*2 < k * 2)
		{
			Q.push({ x * 2, sec + 1 });
			ch[x * 2] = 1;			
		}

	}
}


int main(){
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);

	cin >> n >> k;

	ch.resize(100000);//충분히 크게 잡아줘야 한다.

	BFS(n, k);

	return 0;
}

 

 


 

더 간결한 코드

 

#include <iostream>
using namespace std;

int min(int a, int b) {
	return a < b ? a : b;
}

int BFS(int n, int k)
{
	if (n <= k)
		return k - n;

	else if (n == 1)
		return 1;

	else if (n % 2)
		return 1 + min(BFS(n - 1, k), BFS(n + 1, k));

	else
		return min(n - k, 1 + BFS(n / 2, k));
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);

	int n, k;
	cin >> n >> k;

	cout << BFS(n, k);
}

 

 


 

H3 중제목

본문내용넣기

 

 

 

 

 


 

마무리

마무리