알고리즘/백준(BOJ)
백준 - 12852 1로 만들기 2
시나모온
2020. 6. 27. 01:53
문제 링크입니다 : https://www.acmicpc.net/problem/12852
12852번: 1로 만들기 2
첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 자연수 N이 주어진다.
www.acmicpc.net
#include <iostream>
#include <vector>
#include <queue>
#define INF 987654321
using namespace std;
int N;
vector<bool> visited;
vector<int> parent;
int path[100];
inline int getNext(int cur, int dir) {
switch(dir) {
case 0:
if(cur % 3 == 0) return cur / 3;
break;
case 1:
if(cur % 2 == 0) return cur / 2;
break;
case 2:
return cur - 1;
break;
}
return -INF;
}
vector<int> getShortest(int start) {
visited[start] = true;
queue<int> q;
q.push(start);
vector<int> ret;
while(!q.empty()) {
int cur = q.front();
q.pop();
if(cur == 1) {
int before = cur;
while(before != N) {
ret.push_back(before);
before = parent[before];
}
ret.push_back(before);
return ret;
}
for(int dir = 0; dir < 3; dir++) {
int next = getNext(cur, dir);
if(next <= 0 || next > N) continue;
if(visited[next]) continue;
visited[next] = true;
parent[next] = cur;
q.push(next);
}
}
return ret;
}
int main() {
cin >> N;
visited.assign(N + 1, false);
parent.assign(N + 1, -1);
vector<int> ret = getShortest(N);
cout << ret.size() - 1 << '\n';
for(int i = ret.size() - 1; i >= 0; i--) {
cout << ret[i] << ' ';
}
return 0;
}

개발 환경 : vscode
지적, 조언, 질문 환영입니다! 댓글 남겨주세요~