문제 링크: https://www.acmicpc.net/problem/5014

 

정답으로 가는 조합이 여러개 생길 수 있는데 (e.g. UD, UUDD, UDDUDUDU...) 이 때 답이면서 가장 적게 버튼을 누른 방법을 구하려면 BFS를 사용하면 됩니다.

BFS는 가장 먼저 도달한 경로가 최단경로가 되기 때문에 이걸 사용해야 적절하겠죠

#include <bits/stdc++.h>
using namespace std;


bool visited[1000001];

int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr), cout.tie(nullptr);

	int F, S, G, U, D;
	cin >> F >> S >> G >> U >> D;


	queue<pair<int, int>> q;	// current, counter
	q.emplace(S, 0);
	visited[S] = true;
	while (!q.empty()) {
		auto [current, counter] = q.front();
		q.pop();

		if (current == G) {
			cout << counter << '\n';
			exit(0);
		}
			
		if (current + U <= F && !visited[current + U]) {
			visited[current + U] = true;
			q.emplace(current + U, counter + 1);
		}
		if (current - D > 0 && !visited[current - D]) {
			visited[current - D] = true;
			q.emplace(current - D, counter + 1);
		}
	}

	cout << "use the stairs\n";


	return 0;
}

BFS를 다 돌았을 때 G에 도달하지 못하면 계단을 써야하는 것이니 G를 찾으면 바로 exit(0)을 해줬습니다.

반응형

'Online Judge > 백준' 카테고리의 다른 글

[백준][C++] 6965: Censor  (0) 2020.08.25
[백준][C++] 14720: 우유 축제  (0) 2020.08.24
[백준][C++] 11505: 구간 곱 구하기  (0) 2020.08.19
[백준][C++] 12837: 가계부 (Hard)  (0) 2020.08.18
[백준][C++] 1236: 성 지키기  (0) 2020.08.17