λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Algorithm πŸ§‘πŸ»‍πŸ’»/λ°±μ€€(BOJ)

[λ°±μ€€,c++] 12851번 - μˆ¨λ°”κΌ­μ§ˆ2

by dkswnkk 2021. 11. 4.
 

12851번: μˆ¨λ°”κΌ­μ§ˆ 2

μˆ˜λΉˆμ΄λŠ” 동생과 μˆ¨λ°”κΌ­μ§ˆμ„ ν•˜κ³  μžˆλ‹€. μˆ˜λΉˆμ΄λŠ” ν˜„μž¬ 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 μžˆλ‹€. μˆ˜λΉˆμ΄λŠ” κ±·κ±°λ‚˜ μˆœκ°„μ΄λ™μ„ ν•  수 μžˆλ‹€. λ§Œμ•½, 수빈이의 μœ„μΉ˜κ°€ X일 λ•Œ

www.acmicpc.net

#include <iostream>
#include <queue>
#define MAX 100001

using namespace std;


int N,K;    //N= μˆ˜λΉˆμ΄κ°€ μžˆλŠ” μœ„μΉ˜, K= 동생이 μžˆλŠ” μœ„μΉ˜
int short_time=MAX,cnt;
int visited[MAX];

void bfs(int start,int time){
    queue<pair<int,int>>q;
    q.push({start,0});
    visited[start]=1;

    while(!q.empty()){
        int start=q.front().first;
        int time=q.front().second;
        q.pop();
        visited[start]=1;

        if(cnt&&short_time==time&&start==K){
            cnt++;   //μ΅œμ†Œ μ‹œκ°„μœΌλ‘œ μˆ˜λΉˆμ΄κ°€ 동생이 μžˆλŠ” μœ„μΉ˜μ— 또 λ„μ°©ν–ˆμ„λ•Œ 카운트 μΆ”κ°€
        }

        if(!cnt&&start==K&&short_time){   //졜초둜 μˆ˜λΉˆμ΄κ°€ 동생이 μžˆλŠ” μœ„μΉ˜μ— λ„μ°©ν–ˆμ„ λ•Œ
            short_time=time;
            cnt++;
        }

        if(start+1<MAX&&!visited[start+1]) q.push({start+1,time+1}); //μˆ˜λΉˆμ΄κ°€ 걸을떄
        if(start-1<MAX&&!visited[start-1]) q.push({start-1,time+1}); //μˆ˜λΉˆμ΄κ°€ 걸을떄
        if(start*2<MAX&&!visited[start*2]) q.push({start*2,time+1}); //μˆ˜λΉˆμ΄κ°€ μˆœκ°„μ΄λ™ ν•  λ•Œ

    }


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

    cin>>N>>K;

    bfs(N,0);
    cout<<short_time<<'\n'<<cnt;
}

λŒ“κΈ€