Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <climits>
- #include <cmath>
- using namespace std;
- int px, py, kx, ky, zbir_min = INT_MAX - 1;
- void trans(int &x, int &y)
- {
- int tx = x, ty = y;
- x = tx - 1 - ((2*tx) % 31);
- y = ty + 1 + ((2*tx) % 31);
- }
- void compute(int xi, int yi, int n_trans)
- {
- int mod = n_trans, mod_x = xi, mod_y = yi, raz = 0;
- int zbir2 = 0, tx, ty, zbir_temp = 0;
- int x1, y1, x2, y2;
- for(int i = 0; i < n_trans; i++)
- trans(mod_x, mod_y);
- while(true)
- {
- x1 = mod_x - 1 - ((2*mod_x) % 31);
- y1 = mod_y + 1 + ((2*mod_x) % 31);
- zbir2 = mod;
- x2 = mod_x;
- y2 = mod_y;
- while(x2 > kx)
- {
- if(abs(kx - x2) < 31)
- {
- raz = abs(kx - x2);
- tx = x2;
- ty = y2;
- zbir_temp = zbir2;
- }
- trans(x2, y2);
- zbir2++;
- }
- zbir2 += abs(kx - x2);
- if(zbir2 < zbir_min)
- zbir_min = zbir2;
- x2 = tx + raz;
- y2 = tx - raz;
- zbir2 = zbir_temp;
- zbir2 += raz;
- while(x2 > kx)
- {
- trans(x2, y2);
- zbir2++;
- }
- zbir2 += abs(kx - x2);
- if(zbir2 < zbir_min)
- zbir_min = zbir2;
- if(abs(x1 - mod_x ) >= 31)
- break;
- mod_x++;
- mod_y--;
- mod++;
- }
- }
- int main()
- {
- cin >> px >> py;
- cin >> kx >> ky;
- if((abs(px - kx) != abs(py - ky)) || (px < kx && py < ky ) || (px > kx && py > ky))
- {
- cout << -1 << endl;
- return(0);
- }
- if(px < kx)
- {
- cout << abs(px - kx) << endl;
- return(0);
- }
- compute(px, py, 0);
- compute(px, py, 1);
- int zbir1 = 0;
- while(px > kx)
- {
- trans(px, py);
- zbir1++;
- }
- zbir1 += abs(kx - px);
- cout << min(zbir1, zbir_min) << endl;
- return(0);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement