모든 경우의 수를 담고 찾는다.
#define MIN 0
#define MAX 100000
#include<iostream>
#include<queue>
using namespace std;
/*
동생이 자신보다 작은 곳에 위치할 때 탐색할 필요가 없다.
N < 0 일 때, 탐색할 필요가 없다.
N = K 여도 탐색할 필요가 없다.
N < 10만 이어도 더 넣을 필요가 없다.
visit한 것은 탐색할 필요가 없다.
N*2, N+1도 10만이 넘으면 탐색할 필요가 없다.
*/
int check[MAX+1];
int main() {
int N, K;
cin >> N >> K;
int pos;
int cnt=0; //몇 초인지 세어야 한다.
queue<pair<int,int>> q;
//현 위치와 시간을 넣는다.
q.push(make_pair(N, cnt));
check[N] = 1;
while (!q.empty()) {
pos = q.front().first;
cnt = q.front().second;
q.pop();
//cout << pos <<","<<cnt<< "->";
if (pos == K) { //찾았다 요놈
break;
}
if (pos + 1 <= MAX && check[pos + 1] == 0) {
check[pos + 1] = 1;
q.push(make_pair(pos + 1, cnt + 1));
}
if (pos - 1 >= MIN && check[pos - 1] == 0) {
check[pos - 1] = 1;
q.push(make_pair(pos - 1, cnt + 1));
}
if (pos*2 <= MAX && check[pos*2] == 0) {
check[pos*2] = 1;
q.push(make_pair(pos*2, cnt + 1));
}
}
cout << cnt;
return 0;
}
#include<iostream>
#include<queue>
using namespace std;
#define MIN 0
#define MAX 1000000
int N, K;
queue<pair<int,int>> q;
int visit[MAX+1];
void bfs(int x) {
q.push(make_pair(x,0));
while (!q.empty()) {
int cx = q.front().first;
int ct = q.front().second;
visit[cx] = 1;
q.pop();
if (cx == K) {
cout << ct;
return;
}
if (cx - 1 >= MIN && visit[cx - 1] == 0) q.push(make_pair(cx - 1, ct + 1));
if (cx + 1 <= MAX && visit[cx + 1] == 0) q.push(make_pair(cx + 1, ct + 1));
if (cx * 2 <= MAX && visit[cx * 2] == 0) q.push(make_pair(2 * cx, ct + 1));
}
}
int main() {
cin >> N >> K;
bfs(N);
return 0;
}
'Programming > BOJ' 카테고리의 다른 글
[백준/C++] 백준 1759번 : 암호만들기 (0) | 2020.07.28 |
---|---|
[백준/C++] 백준 1931번: 회의실배정 (0) | 2020.07.20 |
[백준/C++] 백준 1652번: 누울 자리를 찾아라 (0) | 2020.07.15 |
[백준/C++] 1260번: DFS와 BFS (0) | 2020.07.13 |
[백준/C++] 1205: 등수구하기 (0) | 2020.07.13 |