반응형
문제출처
https://www.acmicpc.net/problem/1697
문제풀이
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | /** * DFS문제인지 BFS문제인지 구분하기! * * bfs * 가장 최단 경로를 구하고 싶을때 사용한다.(출발->도착) * 즉, 초기상태로부터 목표값까지의 최소 횟수를 구하고 싶을때 사용한다. * * dfs * 모든 조건(가능성)을 탐색할때 사용한다. * 즉, 어떤 방법이 가장 좋은 방법인지 알고싶을때 사용 * * bfs와 dfs 모두 사용 * 그래프 상 끊어진 연결이 없는지 확인하고자 할때 두가지 모두 사용가능하다. * 즉, 주어진 곳에서 다른 곳으로 도달할 수 있는지 알고 싶을때 사용한다. */ /** * 위 설명을 보면 최단 거리, 최소횟수는 BFS를 이용해야 하는 것을 알 수 있습니다. * 하지만 저는 몰랐어요 ㅠㅠ 저내용을 ㅠㅠ DFS로 풀이하다 무한루프에 빠져 프로그램이 죽어 BFS로 풀이하였습니다. * 문제 자체는 간단합니다. 현재 위치에서 목표 위치로 이동하는데 최소카운트를 출력하는 문제입니다. * bfs로 풀이하기 위해 큐를 하나 생성하는데 큐의 현재위치와 현재 큐에서 얼만큼 움직여야 하는지를 알기 위해 pair로 선언해줍니다. * 방문할 때마다 몇번만에 해당 위치에 도착했는지 카운트를 해주는 것입니다.(문제의 키포인트!) * 즉, 2에서 5를 가기 위해서 2*2를 통해 4가 되었으면 4번 위치의 카운트는 1입니다. * 이후 4->5로 가기위해 4+1로 5가 되면 5의 카운트는 1+1이 되어 2가 되겠죠. */ | cs |
소스코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | #include <iostream> #include <queue> #define MAX 100001 using namespace std; int n,k,result; bool visit[MAX]; int dx[]={-1,0,1}; void bfs(int s) { queue<pair<int, int> > q; q.push(make_pair(s,0)); visit[s]=1; while(!q.empty()) { int x=q.front().first; int cnt=q.front().second; q.pop(); if(x==k) { result=cnt; return; } for(int i=0; i<3; i++) { int nx; if(dx[i]==0) nx=x*2; else nx=x+dx[i]; if(nx<0 || nx>=MAX || visit[nx]) continue; q.push(make_pair(nx, cnt+1)); visit[nx]=1; } } } int main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin>>n>>k; bfs(n); cout<<result; return 0; } | cs |
반응형
'Algorithm' 카테고리의 다른 글
[CodeForce] 71A - Way Too Long Words (0) | 2019.01.25 |
---|---|
[BOJ 10163] 색종이 (0) | 2019.01.24 |
[BOJ 1325] 효율적인 해킹 (0) | 2019.01.23 |
[BOJ 10039] 평균점수 (0) | 2019.01.22 |
[BOJ 2468] 안전영역 (0) | 2019.01.22 |