728x90
#include<iostream>
#include<algorithm>
#include<cmath>
#include<vector>
#include<map>
#include<queue>
#define MAX 51
using namespace std;
queue<pair<int, int>> Q;
int x, y;
bool visited[100001] = {false,};
void BFS() {
Q.push(make_pair(x, 0));
visited[x] = true;
while (!Q.empty()) {
int X = Q.front().first;
int T = Q.front().second;
Q.pop();
if (X == y) {
cout << T << '\n';
return;
}
if (X + 1 > -1 && X + 1 < 100001 && visited[X + 1] == false) {
Q.push(make_pair(X + 1, T + 1));
visited[X + 1] = true;
}
if (X - 1 > -1 && X - 1 < 100001 && visited[X - 1] == false) {
Q.push(make_pair(X - 1, T + 1));
visited[X - 1] = true;
}
if (2 * X < 100001 && visited[2 * X] == false) {
Q.push(make_pair(2 * X, T + 1));
visited[2 * X] = true;
}
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> x >> y;
BFS();
}
DFS , BFS 는 비단 그래프에만 국한되어있지 않다. 이걸 ? 하는 부분에서도 BFS DFS는 유용하게 사용된다. 순열조합의 DFS가 그렇고 최소최단거리를 구하는 BFS가 그렇다.
이 문제 또한 BFS 문제구나! 를 아는 것이 중요하다. 그렇다면 어떻게 이것을 BFS 문제라고 인식해야할까? 나같은 코린이는 이것 부터가 문제였다.
1. 주어진 조건을 본다.
2. 수빈이는 x+1, x-1, 2*x 이렇게 세가지 행동을 할 수 있다. 이것을 보고 "아 계속해서 세가지 조건을 고수해나가는구나!" 라고 판단하고 그래프 처럼 생각할 수 있음을 캐치해야한다.
3. 큐를 생성하여 각 행동을 넣고 BFS하며 목표와의 최소 거리를 출력한다.
'백준 문제 풀이' 카테고리의 다른 글
백준 1261번 알고스팟(C++) (0) | 2022.10.12 |
---|---|
백준 13549 숨바꼭질3 (C++) (0) | 2022.10.10 |
백준 7576번 토마토(C++) (1) | 2022.10.05 |
백준 1707번 이분 그래프(C++) (2) | 2022.08.27 |
백준 1966번 프린터 큐(C++) (1) | 2022.08.25 |