문제가 다른 숨바꼭질과 굉장히 비슷하다. 그래서 금방 최소값은 구할수있었는데, 경로를 어떻게 찾을까 생각을 해보았다.
트리를 그리면 굉장히 쉬운거지만 어떻게 구현을 해야할지 고민을 했다.
음 그냥 무식하게 해보면, 문자 배열을 선언하고, 진행될때마다 어떤 수식을 썻는지 저장을 해준다.
그다음 역추적 방식으로 찾아가주면 된다.
굉장히 코드가 무식하지만, 그래도 원샷원킬했음^^
#include <iostream>
#include<queue>
#include<string>
using namespace std;
struct Que {
int x;
int time;
};
bool vis[100001];
char mul[100001];
int arr[100001];
//굉장히 무식한 방법같지만 순간 떠오른게 이거여서 해봤다...
int main()
{
int a, b,i,j,temp;
cin >> a >> b;
queue<Que> Q;
Q.push({ a,0 });
arr[0] = a;
vis[a] = true;
mul[a] = '=';
while (!Q.empty()) {
auto cur = Q.front();
Q.pop();
if (cur.x == b) {
cout << cur.time << endl;
i = cur.x;
j = cur.time;
break;
}
if (cur.x * 2 < 100001 and vis[cur.x * 2] == false) {
Q.push({ cur.x * 2,cur.time+1 });
vis[cur.x * 2] = true;
mul[cur.x * 2] = '/';
}
if (cur.x + 1 < 100001 and vis[cur.x + 1] == false) {
Q.push({ cur.x + 1,cur.time + 1 });
vis[cur.x + 1] = true;
mul[cur.x + 1] = '-';
}
if (cur.x - 1 >= 0 and vis[cur.x - 1] == false) {
Q.push({ cur.x - 1,cur.time + 1 });
vis[cur.x - 1] = true;
mul[cur.x - 1] = '+';
}
}
temp = j;
while (mul[i] != '=') {//등호가 나올때까지 출력해준다. 곱하기를 했을경우 i를 나누면 그전 숫자가 됨
if (mul[i] == '/') {
arr[j] = i;
i = i / 2;
}
else if (mul[i] == '-') {
arr[j] = i;
i = i - 1;
}
else if (mul[i] == '+') {
arr[j] = i;
i = i + 1;
}
j--;
}
for (int k = 0; k < temp + 1; k++) {//출력해준다.
cout << arr[k] << " ";
}
}
'Development > BOJ' 카테고리의 다른 글
[BOJ]백준 6593번 : 상범빌딩 C++ : 아주정은 (0) | 2020.02.26 |
---|---|
[BOJ] 백준 13549번: 숨바꼭질3 C++ : 아주정은 (0) | 2020.02.26 |
[BOJ] 백준 1600번 : 말이 되고싶은 원숭이 C++ : 아주정은 (0) | 2020.02.26 |
[BOJ] 백준 17071번 : 숨바꼭질 5 C++ : 아주정은 (0) | 2020.02.26 |
[BOJ] 백준 2448번: 별 찍기 - 11 : 아주정은 (0) | 2020.02.26 |