题解
按照题意从1到n再从n到1且每个点都有两个不能重复经过 (1)表示同编号第一个点(2)第二个点 则ai到ai+1只有两种情况
ai(1)~ai+1(1)和ai(2)~ai+1(2) 或者 ai(1)~ai+1(2)和ai(2)~ai+1(1)
直接两种情况取min 再加上an(1)到an(2)的距离即可
AC代码
#include <stdio.h>
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const int MAXN = 1e5 + 10;
struct node
{
int x, y;
}a[MAXN], b[MAXN];
int dis(const node &a, const node &b)
{
return abs(a.x - b.x) + abs(a.y - b.y);
}
int main()
{
#ifdef LOCAL
freopen("C:/input.txt", "r", stdin);
#endif
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i++)
scanf("%d%d%d%d", &a[i].x, &a[i].y, &b[i].x, &b[i].y);
ll ans = dis(a[n], b[n]); //an到an的距离
for (int i = 1; i < n; i++)
ans += min(dis(a[i], a[i + 1]) + dis(b[i], b[i + 1]), dis(a[i], b[i + 1]) + dis(b[i], a[i + 1]));
cout << ans << endl;
return 0;
}