-
백준 12851 (숨바꼭질 2) c++백준 문제 2022. 9. 14. 16:45728x90
숨바꼭질 과 유사한 문제입니다.
대신 최소 시간의 경우의 수를 세는 조건이 추가되었습니다.
예를들어 5에서 17로 간다고 하면
1. (5 -> 10 -> 9 -> 18 -> 17)
2. (5 -> 4 -> 8 -> 16 -> 17)
총 2가지가 존재합니다.
처음에 재귀함수를 구현하여 해결하려 했지만 구현하지 못했습니다.
그 다음 bfs로 접근해 보았습니다.
cin >> n >> k; queue < pair<int, int>>q; q.push({ n, 0 }); while (!q.empty()) { int d = q.front().first; int time = q.front().second; visit[d] = true; if (way && d == k && t == time) way++; if (!way && d == k) { t = time; way++; } q.pop(); if(d-1>=0 && time+1 <=t && !visit[d-1]) q.push({ d - 1, time + 1 }); if (d + 1 <= k && time + 1 <= t && !visit[d+1]) q.push({ d + 1, time + 1 }); if (d * 2 <= 100000 && time + 1 <= t && !visit[2*d]) q.push({ d * 2, time + 1 }); } cout << t << '\n' << way;
전체 코드입니다.
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253#include <iostream>#include <algorithm>#include <cstring>#include <vector>#include <string>#include <stack>#include <queue>#include <deque>#include <cmath>#include <map>#include <set>#include <tuple>#define MAX 2100000000#define inf LONG_MAX#define big(a, b) a > b ? a : busing namespace std;using ll = long long;using ull = unsigned long long;int n, k;int t=MAX, way;bool visit[200001];int main() {ios_base::sync_with_stdio(false), cin.tie(NULL), cout.tie(NULL);cin >> n >> k;queue < pair<int, int>>q;q.push({ n, 0 });while (!q.empty()) {int d = q.front().first;int time = q.front().second;visit[d] = true;if (way && d == k && t == time)way++;if (!way && d == k) {t = time;way++;}q.pop();if(d-1>=0 && time+1 <=t && !visit[d-1])q.push({ d - 1, time + 1 });if (d + 1 <= k && time + 1 <= t && !visit[d+1])q.push({ d + 1, time + 1 });if (d * 2 <= 100000 && time + 1 <= t && !visit[2*d])q.push({ d * 2, time + 1 });}cout << t << '\n' << way;return 0;}cs '백준 문제' 카테고리의 다른 글
백준 2458(키 순서) c++ (0) 2023.02.05 백준 14502 (연구소) c++ (1) 2022.09.19 백준 11404 (플로이드) c++ <플로이드-와샬> (0) 2022.09.14 백준 11054 (가장 긴 바이토닉 부분 수열) c++ (0) 2022.09.12 백준 10830 (행렬 곱셈) c++ (0) 2022.09.08