Problem-Solving/BOJ

[BOJ/백준][Silver1] 12852 : 1로 만들기 2 (C++)

has2 2021. 9. 12. 22:25

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

 

12852번: 1로 만들기 2

첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 자연수 N이 주어진다.

www.acmicpc.net

 

 

[난이도] Silver1
[유형] BFS

[풀이]
전형적인 BFS 문제입니다.

 

 

#include <cstdio>
#include <queue>
using namespace std;
int n,par[1000001];
bool visit[1000001];
void prt(int k){
    if(k==0) return;
    prt(par[k]);
    printf("%d ",k);
}
int main(){
    scanf("%d",&n);
    queue<int> q;
    q.push(n);
    visit[n]=1;
    int cnt=0;
    while(!q.empty()){
        int sz = q.size();
        while(sz--){
            int cur = q.front(); q.pop();
            int nxt;
            if(cur==1){
                printf("%d\n",cnt);
                prt(1);
                return 0;
            }
            if(cur%3==0) {
                nxt=cur/3;
                if(!visit[nxt]){
                    visit[nxt]=1;
                    par[nxt]=cur;
                    q.push(nxt);
                }
            }
            if(cur%2==0) {
                nxt=cur/2;
                if(!visit[nxt]){
                    visit[nxt]=1;
                    par[nxt]=cur;
                    q.push(nxt);    
                }        
            }
            if(cur-1>0){
                nxt=cur-1;
                if(!visit[nxt]){
                    visit[nxt]=1;
                    par[nxt]=cur;
                    q.push(nxt);                       
                }
            }
        }
        cnt++;
    }
}



https://github.com/has2/Problem-Solving/blob/master/boj-solved.ac/Silver1/12852.cpp