Advertisement
allia

фигня

Jan 16th, 2021 (edited)
259
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.95 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.     int dlina = 0, *dx, *dy;
  94.     bool **board;
  95.     kletka start_red, start_green;
  96.     Graph(int x1, int y1, int x2, int y2)
  97.     {
  98.        start_red.new_kletka(x1, y1);
  99.        start_green.new_kletka(x2, y2);
  100.      
  101.       board = new bool*[8]{0};
  102.       for (int i = 0; i < 8; i++)
  103.         board[i] = new bool[8]{0};
  104.  
  105.       board[x1][y1] = 1;
  106.       board[x2][y2] = 1;
  107.  
  108.       dx = new int[8]{2, 2, 1, 1, -1, -1, -2, -2};
  109.       dy = new int[8]{1, -1, 2, -2, 2, -2, 1, -1};
  110.  
  111.       if (x1 == x2 && y1 == y2)
  112.        cout << 0;
  113.       else
  114.        poisk(start_red, start_green);
  115.     }
  116.     void poisk(kletka start_red, kletka start_green);
  117.     bool check_access(kletka* a, kletka* b);
  118.     void all_way(vershina* red, vershina* green, int dlina);
  119.     void variant(vershina* a, queue* Q);
  120.     void get_arr();
  121. };
  122.  
  123. void Graph::variant(vershina* a, queue* Q)
  124. {
  125.   int u = 0, v = 0;
  126.   cout << a->data->x << " " << a->data->y << endl;
  127.  
  128.   for (int i = 0; i < 8; i++)
  129.    {
  130.      u = a->data->x + dx[i];
  131.      v = a->data->y + dy[i];
  132.  
  133.      if (u >= 0 && u < 8 && v >= 0 && v < 8 && !board[u][v])
  134.       {
  135.         kletka current;
  136.         current.new_kletka(u, v);
  137.         //current.print_kletka();
  138.         Q->push_back(&current, a->cost+1, a);
  139.         board[u][v] = 1;
  140.       }
  141.    }
  142. }
  143.  
  144. bool Graph::check_access(kletka* a, kletka* b)
  145. {
  146.  bool x = false;
  147.  cout << a->x+1 << " " << a->y+1 << endl;
  148.  for (int i = 0; i < 8; i++)
  149.   if (a->x == b->x + dx[i] && a->y == b->y + dy[i] )
  150.      x = true;
  151.  
  152.  return x;
  153. }
  154.  
  155. void Graph::poisk(kletka start_red, kletka start_green)
  156. {
  157.   vershina* current = new vershina(&start_red, 0);
  158.   variant(current, &red_Q);
  159.  
  160.   green_Q.push_back(&start_green);
  161.  
  162.   while (red_Q.GetSize() != 0 && green_Q.GetSize() != 0)
  163.   {
  164.     vershina** red = new vershina*[red_Q.GetSize()];
  165.     vershina** green = new vershina*[green_Q.GetSize()];
  166.    
  167.      int red_size = red_Q.GetSize();
  168.      int green_size = green_Q.GetSize();
  169.  
  170.     for (int i = 0; i < red_size; i++)
  171.      {
  172.        red[i] = red_Q.pop_front();
  173.       // cout << red[i]->data->x + 1 << endl;
  174.      }
  175.    
  176.     for (int i = 0; i < green_size; i++)
  177.        green[i] = green_Q.pop_front();
  178.  
  179.     get_arr();
  180.  
  181.    for (int i = 0; i < red_size; i++)
  182.      for (int j = 0; j < green_size; j++)
  183.       if (check_access(red[i]->data, green[j]->data) == true)
  184.         {
  185.                   all_way(red[i], green[j], red[i]->cost);
  186.                   return;
  187.         }
  188.  
  189.       for (int i = 0; i < red_size; i++)
  190.                 variant(red[i], &red_Q);
  191.  
  192.             for (int i = 0; i < green_size; i++)
  193.                 variant(green[i], &green_Q);
  194.  }
  195.  cout << -1;
  196.  return;
  197. }
  198.  
  199. void Graph::get_arr()
  200. {
  201.   for (int i = 0; i < 8; i++)
  202.   {
  203.     for (int j = 0; j < 8; j++)
  204.     {
  205.       cout.width(3);
  206.       cout << board[i][j] << " ";
  207.     }
  208.     cout << endl;
  209.   }
  210. }
  211. void Graph::all_way(vershina* red, vershina* green, int dlina)
  212. {
  213.     kletka* r = new kletka[dlina];
  214.         kletka* g = new kletka[dlina];
  215.  
  216.         vershina* current_red = red;
  217.         vershina* current_green = green;
  218.         int i = 0;
  219.    
  220.         while (current_red->data->x != start_red.x or current_red->data->y !=start_red.y)
  221.         {
  222.             r[i] = *current_red->data;
  223.             g[i+1] = *current_green->data;
  224.             current_red = current_red->prev;
  225.             current_green = current_green->prev;
  226.             i++;
  227.         }
  228.         g[0] = r[0];
  229.    
  230.     cout << red->cost << endl;
  231.  
  232.         for (int i = dlina-1; i >= 0; i--)
  233.         {
  234.             r[i].print_kletka();
  235.       g[i].print_kletka();
  236.         }
  237. }
  238.  
  239. int main()
  240. {
  241.     int x, y, x2, y2;
  242.     cin >> x >> y >> x2 >> y2;
  243.     Graph object(x-1, y-1, x2-1, y2-1);
  244. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement