样例:
#include<stdio.h>
#include<algorithm>
#include<math.h>
using namespace std;
struct zb //声明结构体
{
int a,b;
}t[100001];
bool cmp1(zb p1,zb p2) // 函数: 按照写x排序:如果x不相等按照x的升序排列
{
if(p1.a != p2.a) return p1.a < p2.a;
else return p1.b < p2.b; //如果x相等,按照y坐标的升序排列
}
bool cmp2(zb p1,zb p2) // 函数:按照y坐标排序:如果y不相等,按照y的升序排列;
{
if(p1.b!= p2.b) return p1.b< p2.b;
else return p1.a< p2.a; //如果y相等,按照x的升序排列
}
int main() //主函数如下
{
int n,i;
while(scanf("%d",&n)!=EOF) //多组输入.如果n==0;结束
{
if(n==0)
break;
int sum=0;
for(i=0;i<n;i++) //循环输入坐标(x,y)
{
scanf("%d",&t[i].a);
scanf("%d",&t[i].b);
}
sort(t,t+n,cmp1); // 首先按照x坐标排序
for(i=1;i<n;i=i+2)
{
sum=sum+abs(t[i].b-t[i-1].b); 通过y坐标相减的绝对值的综合计算一部分长度;
}
sort(t,t+n,cmp2); //再按照y坐标排序;
for(i=1;i<n;i=i+2)
{
sum=sum+abs(t[i].a-t[i-1].a); //通过x坐标的相减的绝对值的和计算剩下的部分;
}
printf("The length of the fence will be %d units.\n",sum); //输出总和
}
return 0;
}
解析:
本题思路主要在于两个排序,总长度 的计算来自两部分 1.x坐标相同,对y坐标相减取绝对值,2、y坐标相同,对x坐标相减取绝对值,重点在于排序问题,按照x和y的大小分别排序。最后计算就ok了。