어흥
[백준 16953] A → B (C++) 본문
728x90
반응형
문제 링크: https://www.acmicpc.net/problem/16953
1. 주의할 점
- 정수 A는 2*A , 10*A+1 두가지 형태로 바뀔 수 있다.
- A,B의 최댓값이 10억이라서 해당 정수를 방문 했다는 배열을 만들면 안된다.
2. 구현
-해당 정수를 방문 했다는 배열을 만들면 안된다 -> Set을 사용한다
이유: A가 2배씩 증가한다고 해도 30개만 들어간다(2^30>10억) + 10*A+1의 경우 그보다 적게 들어간다
#include <iostream>
#include <queue>
#include <set>
using namespace std;
struct info {
long long idx;
int val;
};
info tmp;
int main() {
long long start, target, result = -1;
cin >> start >> target;
if (start <= target) {
queue<info> q;
set<long long> s;
tmp.idx = start;
tmp.val = 0;
q.push(tmp);
s.insert(start);
while (!q.empty()) {
long long cidx = q.front().idx;
int cv = q.front().val;
q.pop();
if (cidx == target) {
result = cv + 1;
break;
}
if (cidx * 2 <= target && s.find(cidx * 2)==s.end()) {
tmp.idx = 2 * cidx;
tmp.val = cv + 1;
q.push(tmp);
s.insert(cidx * 2);
}
if (cidx * 10 + 1 <= target && s.find(cidx * 10+1) == s.end()) {
tmp.idx = cidx * 10 + 1;
tmp.val = cv + 1;
q.push(tmp);
s.insert(cidx * 10 + 1);
}
}
}
cout << result;
system("pause");
return 0;
}
728x90
반응형
'알고리즘 > 백준' 카테고리의 다른 글
[백준 12100] 2048 (Easy) (C++) (0) | 2020.03.05 |
---|---|
[백준 14500] 테트로미노 (C++) (0) | 2020.03.05 |
[백준 2056] 작업 (C++) (0) | 2020.03.04 |
[백준 2186] 문자판 (C++) (0) | 2020.03.04 |
[백준 10830] 행렬제곱 (C++) (0) | 2020.03.04 |
Comments