이모저모

12851 본문

BOJ/BFS DFS

12851

Alpa 2017. 6. 1. 22:54


해결방법

BFS를 활용하여 쭉 순회하면서 이미 방문한 숫자도 depth가 같은 경우 경우의 수를 추가하면 된다.

굳이 depth를 저장할 필요없이 훨씬 간단하게 구현할 수 있는데 안했다.....

초심 잃은 것인가.....

아 그리고 굳이 범위인 100000 보다 크게 잡을 필요는 없다. 왜냐하면 v*2를 해서 10만 보다 큰 값에서 감소하는 것보다 (v-1) * 2와 같이 감소하고 곱하는 것이 depth가 반가량 감소하게 되기 때문이다.

나중에 좀 간소하게 짜도록 노력하자.....

시간 복잡도는 O(N) 

왜냐하면 중복 숫자는 큐에 집어 넣지 않기 때문에~~

공간 복잡도는 O(N) 

방문과 숫자를 카운트하기 위해서~~~

 






#include <iostream> 

#include <iterator>

#include <algorithm> 

#include <vector>

#include <map>

#include <set>

#include <queue>

#include <stack>

#include <string>

#include <cmath>

#include <cstdio>

#include <cstring>

using namespace std;

#define MOD 1000000007

#define INF 2147483647

#define LNF 9223372036854775807


int visit[133334],cnt[133334];

int main (){

freopen("sample.txt","r",stdin);

int N, K; 

scanf("%d %d", &N, &K);

memset(visit, -1, sizeof(visit));

queue<pair<int,int> > que;

que.push(make_pair(N,0));

visit[N] = 0;

cnt[N] = 1;

while(!que.empty()){

pair<int,int> v = que.front();

que.pop();

if(visit[K]!=-1&&visit[K]<v.second) break;

if(v.first<K && visit[v.first+1] == -1){

visit[v.first+1] = visit[v.first] + 1;

cnt[v.first+1]+=cnt[v.first];

que.push(make_pair(v.first+1,v.second+1));

}

else if(v.first<K && visit[v.first+1]==v.second+1)

cnt[v.first+1]+=cnt[v.first];


if(v.first-1 >= 0 && visit[v.first-1] == -1){

visit[v.first-1] = visit[v.first] + 1;

cnt[v.first-1]+=cnt[v.first];

que.push(make_pair(v.first-1,v.second+1));

}

else if(v.first-1 >= 0 && visit[v.first-1]==v.second+1)

cnt[v.first-1]+=cnt[v.first];


if((v.first<<1) < 133334 && visit[v.first<<1] == -1){

visit[v.first<<1] = visit[v.first] + 1;

cnt[v.first<<1]+=cnt[v.first];

que.push(make_pair(v.first<<1,v.second+1));

}

else if((v.first<<1) < 133334 && visit[v.first<<1]==v.second+1)

cnt[v.first<<1]+=cnt[v.first];

}

printf("%d\n%d\n", visit[K],cnt[K]);

return 0;

}




'BOJ > BFS DFS' 카테고리의 다른 글

boj 14619  (0) 2017.06.10
14615  (0) 2017.06.03
13913  (0) 2017.06.03
Comments