题意:两个人在一个无限的棋盘上玩.每个人都有个初始位置,它们都要走特定的步数.求可以走到的相同位置.如果不存在这个位置,则输出"impossible".

输入:给定两行\(x, y(-10^{12} <= x, y <= 10^{12})和d(0 <= d <= 10^{12})\).d表示要走的特定步数.

分析:先交换y1, y2(如果y1 < y2),这样y1就在y2上面,那么我们的x1和x2就只存在两种情况,x1 < x2或者x1 > x2,我们只需要判断这两种情况即可.

首先是求出两个点之间的曼哈顿距离,即dist = abs(x1 - x2) + abs(y1 - y2),然后比较d1 + d2和dist的大小,如果dist > d1 + d2,说明不存在合法的点使得两个人走在一起,其次是如果d1 + d2 - dist多出来的步伐是一个玩家要左右横跳的次数,这个次数要% 2 == 0.然后我们需要找出能够到达的合法的点,对于c = d1 + d2 - dist,这个c我们要消耗掉,让两个玩家分担,需要注意的是,分担的时候必须偶数偶数的分担,这样才能反复横跳.

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;
using ll = long long;
int main()
{

        ll x1, y1, d1, x2, y2, d2;
        int t;
        while (cin >> x1 >> y1 >> d1 >> x2 >> y2 >> d2)
        {
            ll dist = abs(x1 - x2) + abs(y1 - y2);

            ll c = (d1 + d2) - dist;

            if (c < 0 || c % 2)
                puts("impossible");
            else
            {
                if (y1 < y2)
                {
                    swap(x1, x2);
                    swap(y1, y2);
                    swap(d1, d2);
                }
                if (x1 <= x2 && y1 >= y2)
                {
                    ll q = min(d1, c);
                    if (q == d1)
                    {
                        if (d1 & 1) d1 = 1;
                        else d1 = 0;
                        d2 = d2 - (c - d1);
                    }
                    else d1 = d1 - c;
                    ll dist = abs(x2 - x1);
                    ll q2 = min(dist, d1);
                    if (q2 == d1) cout << x1 + d1 << " " << y1 << endl;
                    else cout << x2 << " " << y1 - (d1 - dist) << endl;
                }
                else if (x1 >= x2 && y1 >= y2)
                {
                    ll q = min(d1, c);
                    if (q == d1)
                    {
                        if (d1 & 1) d1 = 1;
                        else d1 = 0;
                        d2 = d2 - (c - d1);
                    }
                    else d1 = d1 - c;
                    ll dist = abs(x2 - x1);
                    ll q2 = min(dist, d1);
                    if (q2 == d1) cout << x1 - d1 << " " << y1 << endl;
                    else cout << x2 << " " << y1 - (d1 - dist) << endl;
                }
            }
        }        
    return 0;
}