计蒜客-螺旋困境

小W是一个宅男,喜欢发呆,并幻想一些不切实际的事情。今天,小W又开始做他的白日梦了。他梦见他被困在了一条隧道里,周围漆黑一片。作为一个宅男,小W自然地掏出了手机,打开定位系统,确定了他的位置。又由此在网上搜索到了关于隧道的信息。这条隧道是由一个点向外,呈六角螺旋形展开,并且没有其他的支路。最小的一圈每条边的长度都是1米,边长向外依次增大到2,3...米,如下图所示。


输入数据以一个整数T<104开头,表示测试数据组数。以下每行为一组测试数据,包括4个整数X1,Y1,X2,Y2,描述了小W所在的位置和出口位置的坐标。所有坐标的绝对值不超过1018,并保证答案不超出64位有符号整数的表示范围。

输出对于每组测试数据输出一行,一个整数,表示小W所在的位置和出口的距离。


样例输入

2
1 0 0 1
1 1 2 0

样例输出

2
9




模拟题,还是怪自己脑子不灵活,转死我了,发表自己的小小见解,望大佬们勿喷,欢迎更好的解法
先把它化成正常的坐标系,边分别为1,2,3,,,,我把分成第一二三...层,然后记录下每个点的层数f1,再用f2记录点在该层的进度(每层一条进度线,若两点在同一层上,通
过进度相减便可得两点距离)
这里先看第一层,把这层看成一条线,我定义了一个起点,即线1,比如点(1,1)是在线5上,其f1=2,f2=4(这里的六条边每条除线5(f1+1)外长度都是层数f1)
输入的点必定是在这些线上的,所以我只要判断在哪条线上了
比如线1,x=-f1, f1< y <= 0,当点满足x < 0 && (y <= 0 && y > x)就能确定点一定在线1上


#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
using namespace std;
#define ll long long
#define INF 0x3f3f3f3f

struct Node{
    ll f1, f2;        //f1表示所在的层数,f2表示在该层的进度
};
Node slove(ll x, ll y){
    Node a;
    ll x1 = abs(x), y1 = abs(y), diff = x - y;
    if(abs(x) < 1 && y == 0){          //0层单独拿出来
        a.f1 = 0;
        a.f2 = abs(x);
    }
    else{         //分六条线,依次为第1-6条线
        if(x < 0 && (y <= 0 && y > x)){
            a.f1 = abs(x);
            a.f2 = -y;
        }
        else if(y < 0 && (x < 0 && x >= y)){
            a.f1 = abs(y);
            a.f2 = a.f1 + (x - y);
        }
        else if((x >= 0 && x < (x - y)) && (y < 0 && y >= -(x - y))){
            a.f1 = x - y;
            a.f2 = 2 * a.f1 + x;
        }
        else if(x > 0 && (y >= 0 && y < x)){
            a.f1 = x;
            a.f2 = a.f1 * 3 + y;
        }
        else if(y > 0 && (x <= y && x > -1)){
            a.f1 = y;
            a.f2 = a.f1 * 4 + (y - x);
        }
        else{
            a.f1 = (y - x) - 1;
            a.f2 = a.f1 * 5 + 1 + (a.f1 - y);
        }
    }
    return a;
}
void swap(Node &a, Node &b){
    ll t;
    t = a.f1;
    a.f1 = b.f1;
    b.f1 = t;

    t = a.f2;
    a.f2 = b.f2;
    b.f2 = t;
}
void Print(Node a){
    printf("%lld %lld\n", a.f1, a.f2);
}
int main()
{
    ll sum, x1, y1, x2, y2;
    int T;
    Node a, b;
    scanf("%d", &T);
    while(T--){
        scanf("%lld%lld%lld%lld", &x1, &y1, &x2, &y2);
        a = slove(x1, y1);
        b = slove(x2, y2);
        if(a.f1 > b.f1 || (a.f1 == b.f1 && a.f2 > b.f2))
            swap(a, b);
//        Print(a);
//        Print(b);
        sum = 0;
        if(a.f1 < b.f1){
            if(a.f1 == 0)
                sum += (1 - a.f2);
            else
                sum += (6 * a.f1 + 1 - a.f2);
            a.f1++;
            a.f2 = 0;
        }
        sum += (b.f1 - a.f1) * (3 * a.f1 + 3 * b.f1 - 2);
        sum += (b.f2 - a.f2);
        printf("%lld\n", sum);
    }
    return 0;
}


猜你喜欢

转载自blog.csdn.net/lucky1521/article/details/78312510