관리 메뉴

기억을 위한 기록들

[백준 1697: 숨바꼭질] - C++ 본문

Coding Test - cpp/BFS

[백준 1697: 숨바꼭질] - C++

에드윈H 2021. 1. 14. 13:28

www.acmicpc.net/problem/1697

 

1697번: 숨바꼭질

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

www.acmicpc.net

#include<iostream>
#include<string>
#include<vector>
#include<queue>
#include<string.h>
using namespace std;
int N, K;
int disArr[100001];

int NextLocation(int index, int number) {
	switch (index) {
	case 0:
		return -1 + number;
	case 1:
		return 1 + number;
	case 2:
		return 2 * number;
	}
}

int main()
{
	cin >> N >> K;

	if (N == K) { //위치 같을 경우 바로 종료
		cout << 0 << endl;
		return 0;
	}
	queue<int> Q;

	disArr[N] = 0;


	Q.push(N);
	int curX;
	int nextX;
    
	while (!Q.empty())
	{
		curX = Q.front();
		Q.pop();

		for (int i = 0; i < 3; i++)
		{
			nextX = NextLocation(i, curX);

			if (nextX < 0 || 100000 < nextX)
				continue;

			if (nextX == K) //찾았을 경우
			{
				cout << disArr[curX] + 1 << endl;
				return 0;
			}

			if (disArr[nextX] == 0)
			{

				disArr[nextX] = disArr[curX] + 1;
				Q.push(nextX);
			}
		}
	}

	return 0;
}