学生到检查点的最近路线:C++实现曼哈顿距离算法
在一个二维平面上有N个学生和M个检查点。第i (1<=i<=n)个学生的位置在(ai,bi),第j (1<=j<=m)个检查点的位置在(cj,dj)。
当老师给出信号后,每个学生都会跑向离他最近的检查点。在这里,我们用曼哈顿距离来定义学生距离与检查点的距离。 曼哈顿距离的定义是:点(x1,y1) 和 (x2,y2) 的曼哈顿距离等于|x1−x2|+|y1−y2|。其中,|x| 表示x的绝对值。
如果有多个检查点离某个学生距离相等,他/她会选择编号最小的那个。请聪明的你算算,每个学生分别会选择跑向哪个检查点。
用C++做内容:以下是使用C++实现的解决方案:
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
struct Student {
int id;
int x;
int y;
int nearest_checkpoint;
};
struct Checkpoint {
int id;
int x;
int y;
};
int manhattan_distance(int x1, int y1, int x2, int y2) {
return abs(x1 - x2) + abs(y1 - y2);
}
int main() {
int n, m;
cin >> n >> m;
vector<Student> students(n);
vector<Checkpoint> checkpoints(m);
// 读取学生和检查点的位置
for (int i = 0; i < n; i++) {
students[i].id = i + 1;
cin >> students[i].x >> students[i].y;
}
for (int i = 0; i < m; i++) {
checkpoints[i].id = i + 1;
cin >> checkpoints[i].x >> checkpoints[i].y;
}
// 对每个学生,计算距离最近的检查点
for (int i = 0; i < n; i++) {
int min_distance = manhattan_distance(students[i].x, students[i].y, checkpoints[0].x, checkpoints[0].y);
students[i].nearest_checkpoint = checkpoints[0].id;
for (int j = 1; j < m; j++) {
int distance = manhattan_distance(students[i].x, students[i].y, checkpoints[j].x, checkpoints[j].y);
if (distance < min_distance) {
min_distance = distance;
students[i].nearest_checkpoint = checkpoints[j].id;
} else if (distance == min_distance && checkpoints[j].id < students[i].nearest_checkpoint) {
students[i].nearest_checkpoint = checkpoints[j].id;
}
}
}
// 输出每个学生选择的检查点
for (int i = 0; i < n; i++) {
cout << students[i].nearest_checkpoint << endl;
}
return 0;
}
这个解决方案首先读取学生和检查点的位置,并使用manhattan_distance函数计算学生和检查点之间的曼哈顿距离。然后,对于每个学生,遍历所有的检查点,找到距离最近的检查点。如果有多个检查点距离相等,选择编号最小的那个。最后,输出每个学生选择的检查点编号。
请注意,这个解决方案使用了一些C++的语法和数据结构,如vector和struct。如果你对这些语法和数据结构不熟悉,可以先学习一下相关知识。
原文地址: https://www.cveoy.top/t/topic/qwKn 著作权归作者所有。请勿转载和采集!