PS
백준 16953. A->B
tose33
2021. 8. 10. 16:58
https://www.acmicpc.net/problem/16953
16953번: A → B
첫째 줄에 A, B (1 ≤ A < B ≤ 109)가 주어진다.
www.acmicpc.net
2차원 벡터에 트리를 만드는 형태로 풀었다.
트리의 행번호가 그 숫자를 만드는데 연산을 수행한 횟수라고 할수 있다.
행에 모든 원소들에 대하여 2를곱한값, 1을추가한 값을 다음 행에 푸쉬하는 형태로 트리를 만들고
B를 찾으면 반복문을 탈출하도록 했다.
#include <iostream>
#include <vector>
using namespace std;
#define MAX 1000000000 // 10^9
vector<long long> v[10000000];
int main()
{
long long A, B;
cin >> A >> B;
if(A == B)
{
cout << 1;
return 0;
}
v[0].push_back(A);
int row = 0;
bool flag = false;
bool fail = false;
while(true)
{
// 트리의 가장 왼쪽 자식이 가장 작은값
// 가장 작은값이 B를 넘어버리면 반복문 종료
if(v[row][0] > B) break;
for(int i = 0; i < v[row].size(); i++)
{
long long times = v[row][i] * 2;
long long addOne = (v[row][i] * 10) + 1;
if(times == B || addOne == B)
{
flag = true;
break;
}
if(times <= B)
v[row+1].push_back(times);
if(addOne <= B)
v[row+1].push_back(addOne);
// 트리의 다음 행에 아무것도 푸쉬하지 않았다면 B로 바꿀수없다, 탈출
if(v[row+1].empty())
{
fail = true;
break;
}
}
if(flag || fail) break;
row++;
}
// B를 찾음
if(flag)
cout << row+2;
else
cout << -1;
}
이후에 다른 분들이 푼것을보고 bfs로 풀어봤다
#include <iostream>
#include <queue>
using namespace std;
long long A,B;
int main()
{
cin >> A >> B;
// num, row
queue<pair<long long, long long>> q;
q.push({A,1});
bool flag = false;
int ans;
// bfs
while(!q.empty())
{
long long num = q.front().first;
long long row = q.front().second;
q.pop();
long long times = num*2;
long long addOne = (num*10)+1;
if(times == B || addOne == B)
{
flag = true;
ans = row+1;
break;
}
if(times <= B)
q.push({times, row+1});
if(addOne <= B)
q.push({addOne, row+1});
}
if(flag)
cout << ans;
else
cout << -1;
}