fork download
  1. #include <vector>
  2. #include <iostream>
  3. #include <iomanip>
  4. #include <queue>
  5. #include <stack>
  6. #include <set>
  7.  
  8. using namespace std;
  9.  
  10. struct Node
  11. {
  12. Node(int i, int p = -1):idx(i),prev(p){}
  13. int idx; // Индекс
  14. int prev; // Предыдущий узел - для восстановления пути
  15. bool operator <(const Node& n) const { return idx < n.idx; }
  16. };
  17.  
  18. int main()
  19. {
  20. int start = 1, stop = 6;
  21.  
  22. queue<Node> Q; // Очередь BFS
  23. set<Node> S; // Множество уже обработанных узлов
  24.  
  25. Q.push(Node(start));
  26. while(!Q.empty())
  27. {
  28. S.insert(Q.front()); // Внесли в обработанные
  29. int index = Q.front().idx; // Индекс
  30. if (index == stop) break; // Найден!
  31. Q.pop(); // Убираем из очереди
  32. vector<int> next; // Возможные варианты
  33. next.push_back(2*index);
  34. next.push_back(3*index+1);
  35. if (index%2 == 0) next.push_back(index/2);
  36. if (index%3 == 1) next.push_back((index-1)/3);
  37. for(int i: next) // Обработка возможных вариантов
  38. {
  39. Node n(i,index);
  40. if (S.find(n) != S.end()) continue; // Уже отработан
  41. Q.push(n); // Внесение в очередь еще не рассмотренных
  42. }
  43. }
  44.  
  45. // Вывод цепочки - так как в обратном порядке, используем стек
  46. stack<int> path;
  47. for(int index = Q.front().idx; index != -1; )
  48. {
  49. path.push(index);
  50. auto i = S.find(Node(index)); // Поиск предыдущего
  51. if (i == S.end()) break; // Береженого Бог бережет :)
  52. index = i->prev; // Предыдущий в цепочке
  53. }
  54. // Вывод из стека
  55. while(!path.empty())
  56. {
  57. cout << path.top() << " ";
  58. path.pop();
  59. }
  60. cout << endl;
  61. }
  62.  
  63.  
Success #stdin #stdout 0s 15248KB
stdin
Standard input is empty
stdout
1  4  8  16  5  10  3  6