hdu 4312 C - Meeting point-2 (切比雪夫距离+曼哈顿距离)

一:来源:https://vjudge.net/contest/233206#problem/C

二:题意:同我上一篇博客hdu4311,只不过这回除了可以上下左右的走,还可以对角线方向行走了,相当于现在有8个方向可以走了,比之前的4个方向又多了4个。依旧是求最短距离。

三:问题分析:

想法参考了另一篇题解博客:https://blog.csdn.net/bigbigship/article/details/43163719

联系上一道,总结一下曼哈顿距离和切比雪夫距离:

曼哈顿距离:设A(x1,y1),B(x2,y2),则两点间最短距离(前提是不能沿着对角线直接面对面走,类比有多栋建筑,四通八达的城市,求两个交叉口之间的距离)为:DIS=|x1-x2|+|y1-y2|;故我们可以通过计算其他点到第一个点的距离之和,依次递推出下一个点与上一个点的距离和关系。从而得到所求DIS距离。

切比雪夫距离:(这个主要是可以对角线走,然后把问题转化为曼哈顿问题)设A(x1,y1),B(x2,y2),则两点间最短距离为DIS = max(|x1-x2|,|y1-y2|) = (|x1-x2+y1-y2|+|x1-x2-y1+y2|)/2;

我们将点A的坐标看成(x1+y1,x1-y1),B的坐标看成(x2+y2,x2-y2),

参考博客上说:这个的几何意义上相当于点在原坐标系上逆时针旋转45度,并将坐标扩大√2倍。

求新的曼哈顿距离在/2则得到所求DIS距离。

ps:看到一篇各种距离算法的博客写的挺好的:https://blog.csdn.net/mousever/article/details/45967643

代码实现:

(在hdu 4311代码的基础上进行修改即可)

 

#include  
#include  
#include  
#define N 100005  
#define ll long long  
using namespace std;  
//const int maxn = 5e5+10;  
struct c  
{  
    ll x;  
    ll y;  
    ll dx;  
    ll dy;   
}an[N];  
bool cmp1(c a,c b)//根据x从小到大对结构体排序   
{  
    return a.x>t;  
    while(t--)  
    {  
        memset(an,0,sizeof(an));  
        //cleann();  
        int n,a,b;  
        cin>>n;  
        for(int i=0;i>a>>b;
        	an[i].x=a+b;
			an[i].y=a-b;  
        }  
        //对x  
        sort(an,an+n,cmp1);  
          
        for(int i=1;i

 

你可能感兴趣的:(acm题目练习,dp,切比雪夫距离)