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.  
  21. int start = 1, stop = 6;
  22.  
  23. cin >> stop;
  24.  
  25. queue<Node> Q; // Очередь BFS
  26. set<Node> S; // Множество уже обработанных узлов
  27.  
  28. Q.push(Node(start));
  29. while(!Q.empty())
  30. {
  31. S.insert(Q.front()); // Внесли в обработанные
  32. int index = Q.front().idx; // Индекс
  33. if (index == stop) break; // Найден!
  34. Q.pop(); // Убираем из очереди
  35. vector<int> next; // Возможные варианты
  36. if (2*index <= stop) next.push_back(2*index);
  37. if (3*index <= stop) next.push_back(3*index);
  38. if (index < stop) next.push_back(index+1);
  39. for(int i: next) // Обработка возможных вариантов
  40. {
  41. Node n(i,index);
  42. if (S.find(n) != S.end()) continue; // Уже отработан
  43. Q.push(n); // Внесение в очередь еще не рассмотренных
  44. }
  45. }
  46.  
  47. // Вывод цепочки - так как в обратном порядке, используем стек
  48. stack<int> path;
  49. for(int index = Q.front().idx; index != -1; )
  50. {
  51. path.push(index);
  52. auto i = S.find(Node(index)); // Поиск предыдущего
  53. if (i == S.end()) break; // Береженого Бог бережет :)
  54. index = i->prev; // Предыдущий в цепочке
  55. }
  56. // Вывод из стека
  57. while(!path.empty())
  58. {
  59. cout << path.top() << " ";
  60. path.pop();
  61. }
  62. cout << endl;
  63. }
  64.  
Success #stdin #stdout 0.27s 16376KB
stdin
32718
stdout
1  2  4  8  24  25  50  150  151  453  454  1362  1363  2726  5452  5453  10906  32718