#include <vector>
#include <iostream>
#include <iomanip>
#include <queue>
#include <stack>
#include <set>
using namespace std;
struct Node
{
Node(int i, int p = -1):idx(i),prev(p){}
int idx; // Индекс
int prev; // Предыдущий узел - для восстановления пути
bool operator <(const Node& n) const { return idx < n.idx; }
};
int main()
{
int start = 1, stop = 6;
queue<Node> Q; // Очередь BFS
set<Node> S; // Множество уже обработанных узлов
Q.push(Node(start));
while(!Q.empty())
{
S.insert(Q.front()); // Внесли в обработанные
int index = Q.front().idx; // Индекс
if (index == stop) break; // Найден!
Q.pop(); // Убираем из очереди
vector<int> next; // Возможные варианты
next.push_back(2*index);
next.push_back(3*index+1);
if (index%2 == 0) next.push_back(index/2);
if (index%3 == 1) next.push_back((index-1)/3);
for(int i: next) // Обработка возможных вариантов
{
Node n(i,index);
if (S.find(n) != S.end()) continue; // Уже отработан
Q.push(n); // Внесение в очередь еще не рассмотренных
}
}
// Вывод цепочки - так как в обратном порядке, используем стек
stack<int> path;
for(int index = Q.front().idx; index != -1; )
{
path.push(index);
auto i = S.find(Node(index)); // Поиск предыдущего
if (i == S.end()) break; // Береженого Бог бережет :)
index = i->prev; // Предыдущий в цепочке
}
// Вывод из стека
while(!path.empty())
{
cout << path.top() << " ";
path.pop();
}
cout << endl;
}