Advertisement
allia

2 коня

Jan 16th, 2021
788
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.10 KB | None | 0 0
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. const int inf = 100;
  5.  
  6. struct kletka
  7. {
  8.   public:
  9.   int x, y;
  10.   void new_kletka(int x, int y)
  11.   {
  12.     this->x = x;
  13.     this->y = y;
  14.   }
  15.   void print_kletka()
  16.   {
  17.     cout << x+1 << " " << y+1 << " ";
  18.   }
  19. };
  20.  
  21. class vershina
  22. {
  23.  public:
  24.  int cost;
  25.  kletka* data;
  26.  vershina* prev;
  27.  vershina* next;
  28.  
  29.  vershina(kletka* data, int cost, vershina* prev = nullptr)
  30.  {
  31.    this->data = data;
  32.    this->cost = cost;
  33.    this->prev = prev;
  34.    this->next = nullptr;
  35.  }
  36.  void print_v()
  37.  {
  38.    cout << data->x + 1 << " " << data->y + 1 << endl;
  39.  }
  40. };
  41.  
  42. class queue
  43. {
  44.   public:
  45.     queue()
  46.     {
  47.         size = 0;
  48.         head = nullptr;
  49.         tail = nullptr;
  50.     }
  51.  
  52.     vershina* head;
  53.     vershina* tail;
  54.     int size;
  55.  
  56.     void push_back(kletka* data, int cost = 0, vershina* prev = nullptr)
  57.     {
  58.         vershina* yzel = new vershina(data, cost, prev);
  59.         if (head == nullptr)
  60.         {
  61.             head = yzel;
  62.             tail = yzel;
  63.         }
  64.         else
  65.         {
  66.             tail->next = yzel;
  67.             tail = yzel;
  68.         }
  69.         size++;
  70.     }
  71.  
  72.     vershina* pop_front()
  73.     {
  74.         if (size == 0)
  75.             return 0;
  76.  
  77.         vershina* result = head;
  78.         head = head->next;
  79.         size--;
  80.         return result;
  81.     }
  82.    
  83.     int GetSize()
  84.     {
  85.         return size;
  86.     }
  87. };
  88.  
  89. class Graph
  90. {
  91. public:
  92.     queue red_Q, green_Q;
  93.     kletka **main_board;
  94.     int dlina = 0, *dx, *dy;
  95.     bool **board_red, **board_green;
  96.     kletka start_red, start_green;
  97.     Graph(int x1, int y1, int x2, int y2)
  98.     {
  99.        start_red.new_kletka(x1, y1);
  100.        start_green.new_kletka(x2, y2);
  101.      
  102.       board_red = new bool*[8]{0};
  103.       board_green = new bool*[8]{0};
  104.       main_board = new kletka*[8];
  105.  
  106.       for (int i = 0; i < 8; i++)
  107.         {
  108.           board_red[i] = new bool[8]{0};
  109.           board_green[i] = new bool[8]{0};
  110.           main_board[i] = new kletka[8];
  111.         }
  112.      
  113.       for (int i= 0; i < 8; i++)
  114.        for (int j = 0; j < 8; j++)
  115.         main_board[i][j].new_kletka(i, j);
  116.  
  117.       board_red[x1][y1] = 1;
  118.       board_green[x2][y2] = 1;
  119.  
  120.       dx = new int[8]{2, 2, 1, 1, -1, -1, -2, -2};
  121.       dy = new int[8]{1, -1, 2, -2, 2, -2, 1, -1};
  122.  
  123.       if (x1 == x2 && y1 == y2)
  124.        cout << 0;
  125.       else
  126.        poisk(start_red, start_green);
  127.     }
  128.     void poisk(kletka start_red, kletka start_green);
  129.     bool check_access(kletka* a, kletka* b);
  130.     void all_way(vershina* red, vershina* green, int dlina);
  131.     void variant(vershina* a, queue* Q, bool **board);
  132.     void get_arr();
  133. };
  134.  
  135. void Graph::variant(vershina* a, queue* Q, bool **board)
  136. {
  137.   int u = 0, v = 0;
  138.  
  139.   for (int i = 0; i < 8; i++)
  140.    {
  141.      u = a->data->x + dx[i];
  142.      v = a->data->y + dy[i];
  143.  
  144.      if (u >= 0 && u < 8 && v >= 0 && v < 8 && !board[u][v])
  145.       {
  146.         Q->push_back(&main_board[u][v], a->cost+1, a);
  147.         board[u][v] = 1;
  148.       }
  149.    }
  150. }
  151.  
  152. bool Graph::check_access(kletka* a, kletka* b)
  153. {
  154.  bool x = false;
  155.  for (int i = 0; i < 8; i++)
  156.   if (a->x == b->x + dx[i] && a->y == b->y + dy[i] )
  157.      x = true;
  158.  
  159.  return x;
  160. }
  161.  
  162. void Graph::poisk(kletka start_red, kletka start_green)
  163. {
  164.   vershina* current = new vershina(&start_red, 0);
  165.   variant(current, &red_Q, board_red);
  166.  
  167.   green_Q.push_back(&start_green);
  168.  
  169.   while (red_Q.GetSize() != 0 && green_Q.GetSize() != 0)
  170.   {
  171.     int red_size = red_Q.GetSize();
  172.     int green_size = green_Q.GetSize();
  173.  
  174.     vershina** red = new vershina*[red_size];
  175.     vershina** green = new vershina*[green_size];
  176.  
  177.     for (int i = 0; i < red_size; i++)
  178.        red[i] = red_Q.pop_front();
  179.  
  180.     for (int i = 0; i < green_size; i++)
  181.        green[i] = green_Q.pop_front();
  182.  
  183.    for (int i = 0; i < red_size; i++)
  184.      for (int j = 0; j < green_size; j++)
  185.       if (check_access(red[i]->data, green[j]->data) == true)
  186.         {
  187.                   all_way(red[i], green[j], red[i]->cost);
  188.                   return;
  189.         }
  190.  
  191.       for (int i = 0; i < red_size; i++)
  192.                 variant(red[i], &red_Q, board_red);
  193.  
  194.       for (int i = 0; i < green_size; i++)
  195.                 variant(green[i], &green_Q, board_green);
  196.  }
  197.  cout << -1;
  198.  return;
  199. }
  200.  
  201. void Graph::all_way(vershina* red, vershina* green, int dlina)
  202. {
  203.        kletka* r = new kletka[dlina];
  204.         kletka* g = new kletka[dlina];
  205.  
  206.         vershina* current_red = red;
  207.         vershina* current_green = green;
  208.         int i = 0;
  209.    
  210.         while (current_red->data->x != start_red.x or current_red->data->y !=start_red.y)
  211.         {
  212.             r[i] = *current_red->data;
  213.             g[i+1] = *current_green->data;
  214.             current_red = current_red->prev;
  215.             current_green = current_green->prev;
  216.             i++;
  217.         }
  218.         g[0] = r[0];
  219.    
  220.     cout << red->cost << endl;
  221.  
  222.         for (int i = dlina-1; i >= 0; i--)
  223.         {
  224.             r[i].print_kletka();
  225.             g[i].print_kletka();
  226.         }
  227. }
  228.  
  229. int main()
  230. {
  231.     int x, y, x2, y2;
  232.     cin >> x >> y >> x2 >> y2;
  233.     Graph object(x-1, y-1, x2-1, y2-1);
  234. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement