题意:其实这道题英文描述挺复杂,但是看清楚题目的要求之后发现,这道题的实际意图就是求一个规则多边形的边长,而且由于两两的点都是在一条直线上,所以也没有必要去计算欧式距离,只需要对点进行排序就行了。先对X点就行排序,再对Y点进行排序即可,这道题就是一个根据两次排序来求边长的题 思路只要清楚了就好计算了,代码如下
#include <iostream>
#include <algorithm>
using namespace std;
struct point
{
int x;
int y;
}data[100002];
int cmp1(struct point &a,struct point &b)
{
if(a.x!=b.x)
return a.x<b.x;
return a.y<b.y;
}
int cmp2(struct point &a,const point &b)
{
if (a.y!=b.y)
return a.y<b.y;
return a.x<b.x;
}
int main()
{
int i,n;
while (cin>>n&&n)
{
for (i=0;i<n;i++)
cin>>data[i].x>>data[i].y;
sort(data,data+n,cmp1);
int sum=0;
for (i=0;i<n-1;i+=2)//这里有点关键是i+=2,而不是i++。因为一条线段是由两个点组成的。
{
sum+=abs(data[i].y-data[i+1].y);
}
sort(data,data+n,cmp2);
for (i=0;i<n-1;i+=2)
{
sum+=abs(data[i].x-data[i+1].x);
}
printf("The length of the fence will be %d units.\n",sum);
}
return 0;
}