본문 바로가기
Algorithm/BOJ

[BOJ]13913번: 숨바꼭질 4 (c++)

by HBGB 2020. 5. 29.

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

 

13913번: 숨바꼭질 4

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

www.acmicpc.net

 

#include <iostream>
#include <queue>
#include <algorithm>

using namespace std;

const int MAX = 100000;
int cost[MAX + 1];
int bf_idx[MAX + 1];

bool possible(int n)
{
	return !(n < 0 || n > MAX);
}

// next로 이동 가능하면 큐에 push
// cost와 bf_idx배열에 각각 이동횟수, 현재 위치 저장
void check(queue<int> &q, int next, int now)
{
	if (possible(next) && cost[next] == 0)
	{
		cost[next] = cost[now] + 1;
		bf_idx[next] = now;
		q.push(next);
	}
}

int bfs(int N, int K)
{
	queue<int> q;
	q.push(N);

	while (!q.empty())
	{
		int now = q.front();
		q.pop();

		// 목표점에 도착하면 cost[목표점] 반환 후 종료
		if (now == K)
		{
			return cost[now];
		}

		// -1, +1, *2의 위치로 이동가능하고 아직 방문하지 않았으면
		// cost, bf_idx 배열 저장 후 큐에 push
		check(q, now - 1, now);
		check(q, now + 1, now);
		check(q, now * 2, now);
	}
	return abs(N - K);
}

// bf_idx배열을 bf부터 역순으로 출력
void print_order(int N, int bf)
{
	if (bf != N)
	{
		print_order(N, bf_idx[bf]);
	}
	
	cout << bf << ' ';
}

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

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

	// 최소 이동횟수 출력
	cout << bfs(N, K) << '\n';
	// 이동 경로 출력
	print_order(N, K);

	return 0;
}

 

 

수빈이가 동생을 찾을 수 있는 가장 빠른 시간이 몇 초 후인지 구하는 프로그램을 작성하시오.

최소 이동 횟수를 구해야 하므로, BFS로 풀이한다.

 

숨바꼭질 에서 이동경로 출력하기가 더해진 문제

이전 인덱스를 저장할 배열 하나를 더 만들어 준다.

 

 

 

'Algorithm > BOJ' 카테고리의 다른 글

20200529_TIL  (0) 2020.05.30
[BOJ]14226번: 이모티콘 (c++)  (0) 2020.05.30
[BOJ]1697번: 숨바꼭질 (c++)  (0) 2020.05.29
[BOJ]2146번: 다리 만들기 (c++)  (0) 2020.05.29
[BOJ]16964번: DFS 스페셜 저지 (c++)  (0) 2020.05.29

댓글