Advertisement
Josif_tepe

Untitled

Nov 21st, 2024
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.75 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <queue>
  4. #include <cmath>
  5. #include <map>
  6. using namespace std;
  7.  
  8. int num_white_pawns, num_black_pawns;
  9. bool check_pawns(vector<int> & pawns) {
  10.     int cnt_white = 0;
  11.      
  12.     for(int i = 0; i < pawns.size(); i++) {
  13.         if(pawns[i] != 1) {
  14.             break;
  15.         }
  16.         cnt_white++;
  17.     }
  18.     if(cnt_white != num_white_pawns) {
  19.         return false;
  20.     }
  21.     int cnt_black = 0;
  22.     for(int i = pawns.size() - 1; i >= 0; i--) {
  23.         if(pawns[i] != 2) {
  24.             break;
  25.         }
  26.         cnt_black++;
  27.     }
  28.     if(cnt_black != num_black_pawns) {
  29.         return false;
  30.     }
  31.     return true;
  32.      
  33. }
  34. int main() {
  35.     int n;
  36.     cin >> n;
  37.     num_white_pawns = 0;
  38.     num_black_pawns = 0;
  39.     vector<int> v(n);
  40.     map<vector<int>, bool> visited;
  41.     for(int i = 0; i < n; i++) {
  42.         cin >> v[i];
  43.         if(v[i] == 1) {
  44.             num_white_pawns++;
  45.         }
  46.         if(v[i] == 2) {
  47.             num_black_pawns++;
  48.         }
  49.     }
  50.     visited[v] = true;
  51.     queue<vector<int>> q;
  52.     q.push(v);
  53.     queue<int> q_dist;
  54.     q_dist.push(0);
  55.     queue<vector<int>> steps;
  56.     steps.push({});
  57.    
  58.     while(!q.empty()) {
  59.         vector<int> c = q.front();
  60.         q.pop();
  61.         int dist = q_dist.front();
  62.         q_dist.pop();
  63.         vector<int> v_steps = steps.front();
  64.         steps.pop();
  65.        
  66.         if(check_pawns(c)) {
  67.             cout << dist << endl;
  68.             for(int i = 0; i < v_steps.size(); i++) {
  69.                 cout << v_steps[i] << " ";
  70.             }
  71.             break;
  72.         }
  73.        
  74.         for(int i = 0; i < n; i++) {
  75.             if(c[i] == 1) {
  76.                 if(i - 1 >= 0 and c[i - 1] == 0) {
  77.                     swap(c[i], c[i - 1]);
  78.                     if(!visited[c]) {
  79.                         q.push(c);
  80.                         q_dist.push(dist + 1);
  81.                         visited[c] = true;
  82.                        
  83.                         vector<int> tmp = v_steps;
  84.                         tmp.push_back(i + 1);
  85.                         steps.push(tmp);
  86.                     }
  87.                     swap(c[i], c[i - 1]);
  88.  
  89.                 }
  90.                 if(i - 2 >= 0 and c[i - 1] != 0 and  c[i - 2] == 0) {
  91.                     swap(c[i], c[i - 2]);
  92.                     if(!visited[c]) {
  93.                         q.push(c);
  94.                         q_dist.push(dist + 1);
  95.                         visited[c] = true;
  96.                         vector<int> tmp = v_steps;
  97.                         tmp.push_back(i + 1);
  98.                         steps.push(tmp);
  99.                     }
  100.                     swap(c[i], c[i - 2]);
  101.                 }
  102.             }
  103.             else if(c[i] == 2) {
  104.                 if(i + 1 < n and c[i + 1] == 0) {
  105.                     swap(c[i], c[i + 1]);
  106.                     if(!visited[c]) {
  107.                         visited[c] = true;
  108.                         q.push(c);
  109.                         q_dist.push(dist + 1);
  110.                         vector<int> tmp = v_steps;
  111.                         tmp.push_back(i + 1);
  112.                         steps.push(tmp);
  113.                     }
  114.                     swap(c[i], c[i + 1]);
  115.                 }
  116.                 if(i + 2 < n and c[i + 1] != 0 and c[i + 2] == 0) {
  117.                     swap(c[i], c[i + 2]);
  118.                     if(!visited[c]) {
  119.                         visited[c] = true;
  120.                         q.push(c);
  121.                         q_dist.push(dist + 1);
  122.                         vector<int> tmp = v_steps;
  123.                         tmp.push_back(i + 1);
  124.                         steps.push(tmp);
  125.                     }
  126.                     swap(c[i], c[i + 2]);
  127.                 }
  128.             }
  129.         }
  130.     }
  131.    
  132.    
  133.     return 0;
  134. }
  135.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement