마이 플밍 블로그

백준 12851 - 숨바꼭질2 본문

문제풀이/백준

백준 12851 - 숨바꼭질2

레옹 2021. 11. 27. 09:29
 

12851번: 숨바꼭질 2

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

www.acmicpc.net

#include <iostream>
#include <queue>
using namespace std;
int N, K;
int findCount = 0;
int minFindTime = 1000000000;
int flag[100001] = { 0 };
void FindTime(int index, int time) {
	queue<pair<int,int>> q;
	q.push(make_pair(index, time));

	while (q.size() > 0) {
		int pos = q.front().first;
		int num = q.front().second;
		q.pop();
		if (num > minFindTime) {
			continue;
		}
		if (pos == K) {
			if (minFindTime == num) {
				findCount++;
				continue;
			}

			if (minFindTime > num) {
				minFindTime = num;
				findCount = 1;
				continue;
			}
			continue;
		}
		if (flag[pos] >= num) {
			flag[pos] = num;
			if (pos * 2 < 100001 && flag[pos * 2] >= num) {
				q.push(make_pair(pos * 2, num + 1));
			}
			if (pos + 1 < 100001 && flag[pos + 1] >= num) {
				q.push(make_pair(pos + 1, num + 1));
			}
			if (0 <= pos - 1 && flag[pos - 1] >= num) {
				q.push(make_pair(pos - 1, num + 1));
			}
		}
	}
}
int main() {
	for (int i = 0; i < 100001; i++) {
		flag[i] = 1000000;
	}

	cin >> N >> K;
	FindTime(N, 0);
	cout << minFindTime << endl;
	cout << findCount << endl;
	return 0;
}

 

원래는 큐가 아니라 재귀함수 형식으로 했었는데 이렇게 하면 스택 오버플로우가 떠서 큐로 바꿨다.

 

'문제풀이 > 백준' 카테고리의 다른 글

백준 16930 - 달리기  (0) 2022.01.04
백준 1806 - 부분 합  (0) 2022.01.02
백준 14719 - 빗물  (0) 2021.11.24
백준 16953 - A -> B  (0) 2021.10.10
백준 2110 - 공유기 설치  (0) 2021.10.10