【题解】游览动物园
【题目描述】
动物园有很多游览区,小红已经在动物园的一个游览区游览,突然接到电话,要半个小时内到动物园外面跟一个朋友见面。半个小时小红只够游览完当前区域之后,游览一个最近的景区。已知从一个游览区域只能沿着地图(地图的长宽均小于100)中的直线走(上下左右四个方向),请问离小红当前游览区的最近的一个游览区的坐标是多少,如果有多个点离小红的位置都很近,请输出离出口最近的那个点的坐标(不存在多个点距离出口一样近)?
例如:假设小红在孔雀区(3,2),离小红最近的2处游览区分别是猴山(2,0)和虎山(5,3),但猴山离入口更近,因此输出猴山的坐标。
【输入描述】
第一行2个变量,为小红所在的游览区的坐标
第二行一个整数n,为该动物园内游览区的数量(n<=100)
接下来的n行,每行2个数,代表动物园的n个游览区的坐标(本题所有的坐标值都在1~1000的范围内)
【输出描述】
离小红最近的游览区的坐标。
【样例输入】
3 2 5 2 0 5 3 3 2 5 5 3 8
【样例输出】
2 0
【题目分析】
题目比较简单,是求给定坐标和求的坐标之间的距离,不过不是两点之间的距离。
注意题目要求,只能按照直线走。
可以定义一个结构体,求出给定坐标x的距离和y的距离,然后计算总和,最后排序。
注意题目挖的坑,小红本身在景区内,如果单纯输出最近距离,肯定是小红当前位置,所以应该输出第二近的位置。
5. 此题的疑惑,题目中说 “不存在多个点距离出口一样近”
但是。题目中描述,小红所处位置(3,2)距离(2,0)点是1+2=3。
(3,2)点距离(5,3)点也是2+1=3。那么输出的是(2,0)。猜想此动物园的入口和出口是同一个地方,坐标点是(0,0)
因此,我们还要把每个坐标加起来,如果距离一样的情况下,则处理此特殊情况
【参考答案】
#include<bits/stdc++.h> using namespace std; int x,y,n; struct node{ int x,y; //每个点的坐标 int s; //每个点与初始坐标的距离 int e; //每个点与入口的距离 }; node m[150]; bool cmp(node a,node b){ if(a.s!=b.s) return a.s<b.s; return a.e<b.e; //特殊情况,如果距离想等,则判断距离入口的距离。 } int main(){ cin>>x>>y>>n; //输出初始坐标和组数 for(int i=0;i<n;i++){ cin>>m[i].x>>m[i].y; m[i].s=abs(m[i].x-x)+abs(m[i].y-y); m[i].e=abs(m[i].y)+abs(m[i].x); } sort(m,m+n,cmp); //排序 cout<<m[1].x<<' '<<m[1].y; //输出第二小的。(因为第一小的一定是本身) return 0; }
扫描二维码推送至手机访问。
版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。