代码思路:
首先读入点的个数、给定点的 x 和 y 坐标。接着,循环读入每一个点的坐标,并计算该点到给定点的欧几里得距离。把每个点的下标和它到给定点的距离存储在一个结构体数组中。
之后,对所有点按照到给定点的距离进行排序,若距离相同则按照下标从小到大排序。最后,输出距离最小的前三个点的下标。
代码实现:
#include<iostream>
#include<algorithm>
using namespace std;
struct ans { //定义结构体
int index; //表示点的下标
double distance; //表示点到给定点的欧几里得距离
};
bool cmp(ans a, ans b) { //比较函数,用于排序
if (a.distance != b.distance)
return a.distance < b.distance; //根据距离从小到大排序
else
return a.index < b.index; //距离相等时,按下标从小到大排序
}
int main()
{
int n, x, y;
int arr[210][2] = { 0 }; //定义一个二维数组存储多个点
ans ans[210] = { 0 }; //定义一个结构体数组存储每个点到给定点的距离和它的下标
double distance = 0; //初始化距离为0
cin >> n >> x >> y;
for (int i = 0; i < n; i++)
{
cin >> arr[i][0]; //输入第 i 个点的 x 坐标
cin >> arr[i][1]; //输入第 i 个点的 y 坐标
distance = pow(arr[i][0] - x, 2) + pow(arr[i][1]-y, 2); //计算第 i 个点到给定点的欧几里得距离
ans[i].index = i+1; //记录第 i 个点的下标
ans[i].distance = distance; //记录第 i 个点到给定点的距离
}
sort(ans, ans + n, cmp); //对所有点按照距离进行排序
for (int i = 0; i < 3; i++) //选出距离最小的前三个点
{
cout << ans[i].index << endl;
}
}
//测试点
//5 0 1
//- 1 0
//0 0
//1 0
//0 2
//- 1 2
//2
//4
//1