Advertisement
Korotkodul

Высшая проба_единственный номер

Nov 14th, 2021
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.80 KB | None | 0 0
  1. #include <iostream>
  2. #include <cmath>
  3. #include <vector>
  4. #include <set>
  5. #include <string>
  6. #include <algorithm>
  7. using namespace std;
  8. using ll = long long;
  9. void co(vector <int> v){
  10.     for (auto x: v) cout<<x<<' ';
  11.     cout<<'\n';
  12. }
  13.  
  14. struct p{
  15.     int x, y, clr;
  16. };
  17.  
  18. int x_hlp(int x1, int y1, int x2, int y2){
  19.     int xh1, xh2, yh; //help
  20.     yh = y2;
  21.     //cout<<"yh = "<<yh<<'\n';
  22.     int dif = abs(y1 - yh);
  23.     //cout<<"dif = "<<dif<<'\n';
  24.     xh1 = x1 - dif;
  25.     xh2 = x1 + dif;
  26.     return xh1;
  27. }
  28.  
  29.  
  30. //color = {0, 1} = { white, black}
  31.  
  32. int col(int x, int y){//color
  33.     int xh = x_hlp(x, y, 0, 0);
  34.     //cout<<"xh = "<<xh<<'\n';
  35.     if (abs(xh) % 2 == 0) {
  36.         //white
  37.         return 0;
  38.     }else{
  39.         return 1;
  40.     }
  41. }
  42.  
  43. void cp(p P, string nm){
  44.     cout<<"point = "<<nm<<'\n';
  45.     cout<<"x = "<<P.x<<"  y = "<<P.y<<"  color = "<<P.clr<<'\n';
  46. }
  47.  
  48. int y_ln(int x2, int y2, int x_md){//y in line with some (x, y)
  49.     int dif = abs(x2 - x_md);
  50.     int y_ln1, y_ln2;
  51.     y_ln1 = y2 - dif;
  52.     y_ln2 = y2 + dif;
  53.     //они равносильны!
  54.     return y_ln1;
  55. }
  56.  
  57. int main()
  58. {
  59.     int x1,x2, y1,y2;
  60.     cin>>x1>>y1>>x2>>y2;
  61.     p p1 = {x1, y1};
  62.     p1.clr = col(x1, y1);
  63.     p p2 = {x2, y2};
  64.     p2.clr = col(x2, y2);
  65.     //cp(p1, "p1");
  66.     //cp(p2, "p2");
  67.     bool can;
  68.     if (p1.clr == 0 && p2.clr == 1){
  69.         //cout<<"ONE\n";
  70.         can = 1;
  71.         vector <pair<int,int>> go(8);
  72.         go[0] = {x1 - 1, y1  + 2};
  73.         go[1] = {x1 + 1, y1 + 2};
  74.         go[2] = {x1 + 2, y1 + 1};
  75.         go[3] = {x1 + 2, y1 - 1};
  76.         go[4] = {x1 + 1, y1 - 2};
  77.         go[5] = {x1 - 1, y1 - 2};
  78.         go[6] = {x1 - 2, y1 - 1};
  79.         go[7] = {x1 - 2, y1 + 1};
  80.         bool fast = 0;
  81.         int fast_x, fast_y;
  82.         int X,Y;
  83.         //первый вопрос - супер_fast
  84.         //второй вопрос - fast
  85.         for (auto pnt: go){
  86.             X = pnt.first;
  87.             Y = pnt.second;
  88.             //cout<<"X = "<<X<<" Y = "<<Y<<'\n';
  89.             if (abs(X - x2) == abs(Y - y2)){
  90.                 fast = 1;
  91.                 if (X == x2 && Y == y2){
  92.                     cout<<1<<'\n';
  93.                     cout<<x2<<' '<<y2<<'\n';
  94.                     exit(0);
  95.                 }
  96.                 fast_x = X;
  97.                 fast_y = Y;
  98.             }
  99.         }
  100.         if (fast){
  101.             cout<<2<<'\n';
  102.             cout<<fast_x<<' '<<fast_y<<'\n';
  103.             cout<<x2<<' '<<y2<<'\n';
  104.         }else{
  105.             X = go[0].first;
  106.             Y = go[0].second;
  107.             int xH = x_hlp(X, Y, x2, y2);
  108.             int x_mid = abs( max(xH,x2) - min(xH, x2)) / 2 + min(xH, x2);
  109.             //cout<<"x_mid = "<<x_mid<<'\n';
  110.             int y_mid = y_ln(x2, y2, x_mid);
  111.             //cout<<"y_mid = "<<y_mid<<'\n';
  112.             cout<<3<<'\n';
  113.             cout<<X<<' '<<Y<<'\n';
  114.             cout<<x_mid<<' '<<y_mid<<'\n';
  115.             cout<<x2<< ' '<<y2<<'\n';
  116.         }
  117.     }
  118.     else if (p1.clr == 1 && p2.clr == 1){
  119.             can = 1;
  120.             //cout<<"TWO\n";
  121.         if (abs(x1 - x2) == abs(y1 - y2)){
  122.             cout<<1<<'\n';
  123.             cout<<x2<<' '<<y2<<'\n';
  124.         }
  125.         else{
  126.             int xh;//проекция точки (x1, y1) на ось y = y2
  127.             xh = x_hlp(x1, y1, x2, y2);
  128.             int x_md;//middle = between min(x1,x2) and max(x1,x2)
  129.             x_md = abs( max(xh,x2) - min(xh, x2)) / 2 + min(xh, x2);
  130.             //cout<<"x_md = "<<x_md<<'\n';
  131.             int y_md = y_ln(x2, y2, x_md);
  132.             //cout<<"y_md = "<<y_md<<'\n';
  133.             cout<<2<<'\n';
  134.             cout<<x_md<<' '<<y_md<<'\n';
  135.             cout<<x2<<' '<<y2<<'\n';
  136.         }
  137.  
  138.     }
  139.     else can = 0;
  140.     //cout<<"can = "<<can<<'\n';
  141.     if (!can){
  142.         cout<<-1;
  143.         exit(0);
  144.     }
  145.  
  146. }
  147. //4 2 -8 -1
  148.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement