1.题目描述
2.算法思想
步骤1:建立一个结构体数组,存储每个检测点的信息,包括编号number,坐标x,y,距离d。编号是用来判断每个检测点的身份,坐标用于计算其与 市民所在位置的距离。
步骤2:分行输入每个检测点的坐标,然后通过输入每个检测点的坐标x,y,来计算每个检测点与市民所在初始点的距离d,记得此处的编号number从1开始,要一一对应。
步骤3:用一个排序功能将所有检测点,按照距离d优先,距离d相等的情况下编号number大小决定的条件,从小到大排序。最后依次按行输出前三个最小的检测点的编号number。
3.代码
#include<iostream>
#include<algorithm>
using namespace std;
struct point {
int number;//检测点的编号
int x;//横坐标
int y;//纵坐标
double d;//距离居民点的距离
};
int main() {
int n, x_0, y_0;
cin >> n;
cin >> x_0 >> y_0;
struct point point_s[n];//定义一个结构体数组,存储每个检测点的信息
for (int i = 0; i < n; i++) {//输入数据
point_s[i].number = i + 1;//因为编号从1开始,从0开始的i需要加1
cin >> point_s[i].x >> point_s[i].y;//输入坐标点
//为了防止开方后出现根号,直接取平方的结果作为距离,大小比较依旧不变
point_s[i].d = (x_0 - point_s[i].x) * (x_0 - point_s[i].x) + (y_0 - point_s[i].y) * (y_0 - point_s[i].y);
}
for (int i = 0; i < n; i++) {
//以每个检测点的距离d和编号number为标准,从小到大排序
double min = point_s[i].d;
int k = i;
for (int j = i + 1; j < n; j++) {
if (point_s[j].d < min) {
//距离小的结构体元素,成为待交换的一方
min = point_s[j].d;
k = j;
}
else if (point_s[j].d == min && point_s[j].number < point_s[k].number) {
//距离相等的结构体元素,编号小的成为待交换的一方
min = point_s[j].d;
k = j;
}
}
swap(point_s[i], point_s[k]);
}
for (int i = 0; i < 3; i++) {//仅输出前三个结构体元素
cout << point_s[i].number << endl;
}
return 0;
}