LYDSY 1193

题目大意

暂无

题目解法

暂无

RTFC

#include <cstdio>
#include <cstring>
inline int abs(int x) { return x > 0 ? x : -x; }
inline void swap(int &x, int &y)
{
    int t = x;
    x = y;
    y = t;
}
const int dx[] = {1, 2, 2, 1, -1, -2, -2, -1};
const int dy[] = {2, 1, -1, -2, -2, -1, 1, 2};
int que[1 << 20], head, tail, dis[(1 << 14) - 1];
#define zip(x, y) ((x << 7) + y)
#define unzip(x, y, val) (x = val >> 7, y = val & 127)
int main()
{
    int x, y, xp, yp, xs, ys;
    scanf("%d%d%d%d", &xp, &yp, &xs, &ys);
    x = abs(xs - xp), y = abs(ys - yp);
    int ans = 0;
    while (x + y >= 50)
    {
        if (x < y) swap(x, y);
        if (x - 4 >= y << 1)
            x -= 4;
        else
            x -= 4, y -= 2;
        ans += 2;
    }
    memset(dis, -1, sizeof(dis));
    int i = x, j = y;
    dis[que[tail++] = zip(i, j)] = 0;
    while (head < tail)
    {
        unzip(i, j, que[head]);
        head++;
        for (int k = 0; k < 8; k++)
            if (dis[zip(i + dx[k], j + dy[k])] == -1)
                dis[que[tail++] = zip(i + dx[k], j + dy[k])] = dis[zip(i, j)] + 1;
    }
    printf("%d", dis[0] + ans);
    return 0;
}