득이공간

[백준 C++] 1697 숨바꼭질 - 너비우선탐색 본문

PS/알고리즘 문제풀이

[백준 C++] 1697 숨바꼭질 - 너비우선탐색

쟁득 2024. 2. 7. 09:42
 

1697번: 숨바꼭질

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

www.acmicpc.net

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

const int& MaxSize = 100000;

int Map[MaxSize + 1];
queue<int> SearchQueue;

bool IsInSize(int Node)
{
	return (Node >= 0 && Node <= MaxSize);
}

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

	int N, K;
	cin >> N >> K;

	SearchQueue.emplace(N);
	while (!SearchQueue.empty())
	{
		int Current = SearchQueue.front();
		SearchQueue.pop();

		int Neighbors[3] =
		{
			Current - 1,
			Current + 1,
			2 * Current
		};

		for (int i = 0; i < 3; ++i)
		{
			if (IsInSize(Neighbors[i])
				&& Map[Neighbors[i]] == 0)
			{
				Map[Neighbors[i]] = Map[Current] + 1;
				SearchQueue.emplace(Neighbors[i]);
			}
		}
	}

	if (N == K)
	{
		cout << 0;
	}
	else
	{
		cout << Map[K];
	}
}

 

출발 노드로부터 위치가 n-1, n+1, 2*n인 이웃 노드로 너비 우선 탐색을 수행해서

각 노드마다 몇 번째로 도착했는지를 저장하도록 풀었습니다.