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