最短曼哈頓距離(遞推+枚舉 C++)

最短曼哈頓距離
總時間限制: 1000ms 內存限制: 65536kB
描述
假設兩點座標A(x1,y1),B(x2,y2),兩點間的直線距離又叫做歐基裏德距離,定義爲sqrt((x1-x2)2+(y1-y2)2);兩點間的曼哈頓距離被定義爲fabs(x1-x2)+fabs(y1-y2)。
G老師準備從曼哈頓這座城市的西北角A點出發,到終點B點,沿途要按順序經過n-2個旅遊景點(起點和終點也算在n裏邊),n個點的座標需要你來輸入,起點A座標固定爲(0,0),G老師有點累,打算少去1個旅遊景點(不能少去起點和終點),請你幫忙,計算出少去哪一個景點可以使得從起點A到終點B的曼哈頓距離最短。
輸入
共n+1行
第1行1個正整數n,表示G老師旅行的軌跡點數
後n行,每行兩個數,表示該旅遊景點的座標
數據規模:
對於40%的數據滿足:3≤n≤1000
對於100%的數據滿足:3≤n≤100000,-1000≤xi,yi≤1000
輸出
兩個整數,用空格隔開
第一個數表示不去哪一個景點的順序編號(如有多個點不去的曼哈頓距離一樣,輸出順序路徑中不去的最後1個景點)
第二個數表示不去那個景點之後,起點到終點的最小曼哈頓距離
樣例輸入

4
0 0
8 3
11 -1
10 0

樣例輸出

2 14

提示
找出遞推式
思路點拔:拿到題目後,我們會發現,想要直接求解不太現實所以,先算出第一個景點與
最後一個景點的曼哈頓距離,然後枚舉去掉每個城市後的最短曼哈頓距離,然後算出最小的那
個,就結束了,放心,這道題稍加枚舉不會超時的!!

#include<cstdio>
#include<cmath>
using namespace std;
struct mhd //定義結構體,存儲每個景點的下標
{
    int x,y;
}s[100005];
int dist(const mhd &a,const mhd &b) //計算曼哈頓距離
{
    return fabs(a.x-b.x)+fabs(a.y-b.y);
}
int main()
{
    int n,sum=0,index=0;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d %d",&s[i].x,&s[i].y); //輸入每個景點的座標
    }
    for(int i=2;i<=n;i++)
    {
        sum+=dist(s[i-1],s[i]); //算出總共的曼哈頓距離
    }
    int ans=sum;
    for(int i=2;i<n;i++) //計算如果這個景區不去的總曼哈頓距離,然後算出最短的那個,就是結果
    {
        if(sum-dist(s[i-1],s[i])-dist(s[i],s[i+1])+dist(s[i-1],s[i+1])<=ans) 
        //注意:是小於等於不是小於,如果是小於,那麼就不能保證輸出的是最後一個
        {
            ans=sum-dist(s[i-1],s[i])-dist(s[i],s[i+1])+dist(s[i-1],s[i+1]);
            index=i;//保存是那個景點去掉後曼哈頓距離最短
        }
    }
    printf("%d %d\n",index,ans);  //輸出這個去掉的景點與最短曼哈頓距離
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章