Advertisement
coloriot

HA30_EGE(4)

Nov 8th, 2024
19
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.43 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <queue>
  4.  
  5. using namespace std;
  6.  
  7. class NumberTransformer {
  8. private:
  9.     static const int MAX_NUMBER = 10000;
  10.     bool visited[MAX_NUMBER];
  11.     int prev[MAX_NUMBER];
  12.  
  13.     bool is_valid(int number) {
  14.         if (number < 1000 || number >= MAX_NUMBER)
  15.             return false;
  16.         int n = number;
  17.         while (n > 0) {
  18.             int digit = n % 10;
  19.             if (digit == 0)
  20.                 return false;
  21.             n /= 10;
  22.         }
  23.         return true;
  24.     }
  25.  
  26.     vector<int> get_neighbors(int number) {
  27.         vector<int> neighbors;
  28.         int digits[4];
  29.         int n = number;
  30.         for (int i = 3; i >= 0; --i) {
  31.             digits[i] = n % 10;
  32.             n /= 10;
  33.         }
  34.  
  35.         // Операция 1: Увеличение первой цифры на 1 (если не 9)
  36.         if (digits[0] < 9) {
  37.             int new_digits[4];
  38.             for (int i = 0; i < 4; ++i) new_digits[i] = digits[i];
  39.             new_digits[0] += 1;
  40.             int new_number = new_digits[0]*1000 + new_digits[1]*100 + new_digits[2]*10 + new_digits[3];
  41.             if (is_valid(new_number))
  42.                 neighbors.push_back(new_number);
  43.         }
  44.  
  45.         // Операция 2: Уменьшение последней цифры на 1 (если не 1)
  46.         if (digits[3] > 1) {
  47.             int new_digits[4];
  48.             for (int i = 0; i < 4; ++i) new_digits[i] = digits[i];
  49.             new_digits[3] -= 1;
  50.             int new_number = new_digits[0]*1000 + new_digits[1]*100 + new_digits[2]*10 + new_digits[3];
  51.             if (is_valid(new_number))
  52.                 neighbors.push_back(new_number);
  53.         }
  54.  
  55.         // Операция 3: Циклический сдвиг вправо
  56.         int right_rotated_digits[4];
  57.         right_rotated_digits[0] = digits[3];
  58.         right_rotated_digits[1] = digits[0];
  59.         right_rotated_digits[2] = digits[1];
  60.         right_rotated_digits[3] = digits[2];
  61.         int right_rotated_number = right_rotated_digits[0]*1000 + right_rotated_digits[1]*100 + right_rotated_digits[2]*10 + right_rotated_digits[3];
  62.         if (is_valid(right_rotated_number))
  63.             neighbors.push_back(right_rotated_number);
  64.  
  65.         // Операция 4: Циклический сдвиг влево
  66.         int left_rotated_digits[4];
  67.         left_rotated_digits[0] = digits[1];
  68.         left_rotated_digits[1] = digits[2];
  69.         left_rotated_digits[2] = digits[3];
  70.         left_rotated_digits[3] = digits[0];
  71.         int left_rotated_number = left_rotated_digits[0]*1000 + left_rotated_digits[1]*100 + left_rotated_digits[2]*10 + left_rotated_digits[3];
  72.         if (is_valid(left_rotated_number))
  73.             neighbors.push_back(left_rotated_number);
  74.  
  75.         return neighbors;
  76.     }
  77.  
  78. public:
  79.     NumberTransformer() {
  80.         for (int i = 1000; i < MAX_NUMBER; ++i) {
  81.             visited[i] = false;
  82.             prev[i] = -1;
  83.         }
  84.     }
  85.  
  86.     void BFS(int start, int target) {
  87.         queue<int> q;
  88.         visited[start] = true;
  89.         q.push(start);
  90.  
  91.         while (!q.empty()) {
  92.             int current = q.front();
  93.             q.pop();
  94.  
  95.             if (current == target)
  96.                 return;
  97.  
  98.             vector<int> neighbors = get_neighbors(current);
  99.             for (size_t i = 0; i < neighbors.size(); ++i) {
  100.                 int next = neighbors[i];
  101.                 if (!visited[next]) {
  102.                     visited[next] = true;
  103.                     prev[next] = current;
  104.                     q.push(next);
  105.                 }
  106.             }
  107.         }
  108.     }
  109.  
  110.     vector<int> get_path(int start, int target) {
  111.         vector<int> path;
  112.         int current = target;
  113.         while (current != -1) {
  114.             path.push_back(current);
  115.             if (current == start)
  116.                 break;
  117.             current = prev[current];
  118.         }
  119.         // Разворачиваем путь
  120.         vector<int> reversed_path;
  121.         for (int i = path.size() - 1; i >= 0; --i)
  122.             reversed_path.push_back(path[i]);
  123.         return reversed_path;
  124.     }
  125. };
  126.  
  127. int main() {
  128.     int start, target;
  129.     cin >> start >> target;
  130.  
  131.     NumberTransformer transformer;
  132.     transformer.BFS(start, target);
  133.  
  134.     vector<int> path = transformer.get_path(start, target);
  135.  
  136.     cout << path.size() << endl;
  137.     for (size_t i = 0; i < path.size(); ++i) {
  138.         cout << path[i] << endl;
  139.     }
  140.  
  141.     return 0;
  142. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement