帮我用C语言实现查找最近点 Description 给定一组二维点,每个点对应一个字符。给定任意一个位置,输出距离其最近点到它的距离。 【注意】输出要求:四位小数,输出4位小数的方式:printf("%.4f\n", x),为了保证精度,请大家用double进行输入和计算。 Input 第一行两个数:点的个数N以及查询的个数M 接下来N行,每行2个浮点数和一个字符,代表点的坐标以及其对应的字符 接下来M行,每行2个浮点数,代表希望查询的位置 数据范围满足 N<=10000, M<=10000 Output M行,每行为点集中距离查询位置最近的距离,精确到小数点后4位。

时间: 2024-02-16 07:00:33 浏览: 28
以下是基于kd-tree算法实现的C语言代码,实现查找最近点: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #define MAXN 10005 typedef struct Point { double x, y; char c; } Point; typedef struct Node { Point p; struct Node *lc, *rc; } Node; int n, m; Point points[MAXN]; Node *root; int cmp(const void *a, const void *b) { Point *p1 = (Point *)a; Point *p2 = (Point *)b; if (p1->x != p2->x) return p1->x < p2->x ? -1 : 1; return p1->y < p2->y ? -1 : 1; } void build_kd_tree(Node **p, int l, int r, int depth) { if (l >= r) return; int mid = l + r >> 1; *p = (Node *)malloc(sizeof(Node)); (*p)->p = points[mid]; build_kd_tree(&(*p)->lc, l, mid, depth + 1); build_kd_tree(&(*p)->rc, mid + 1, r, depth + 1); if (depth & 1) qsort(&points[l], r - l, sizeof(Point), cmp); else qsort(&points[l], r - l, sizeof(Point), cmp); } double dist(Point *p1, Point *p2) { double dx = p1->x - p2->x, dy = p1->y - p2->y; return sqrt(dx * dx + dy * dy); } double query_kd_tree(Node *p, Point *q, double d, int depth) { if (!p) return d; double d1 = dist(&p->p, q); if (d1 < d) d = d1; double dl = query_kd_tree(p->lc, q, d, depth + 1); double dr = query_kd_tree(p->rc, q, d, depth + 1); if (depth & 1) { if (q->y - d < p->p.y) d = fmin(d, dl); if (q->y + d > p->p.y) d = fmin(d, dr); } else { if (q->x - d < p->p.x) d = fmin(d, dl); if (q->x + d > p->p.x) d = fmin(d, dr); } return d; } int main() { scanf("%d%d", &n, &m); for (int i = 0; i < n; ++i) scanf("%lf%lf%*c%c", &points[i].x, &points[i].y, &points[i].c); build_kd_tree(&root, 0, n, 0); for (int i = 0; i < m; ++i) { Point q; scanf("%lf%lf", &q.x, &q.y); printf("%.4f\n", query_kd_tree(root, &q, 1e10, 0)); } return 0; } ``` 该算法中,首先将二维平面上的点按照x轴或y轴的大小排序,然后以中间点为根节点,递归构建kd-tree。在查询过程中,根据当前节点所在深度的奇偶性,判断需要遍历左子树或右子树,并且在遍历过程中,通过比较当前节点和查询点之间的距离和当前最小距离,来决定是否需要更新最小距离。

相关推荐

最新推荐

recommend-type

C#实现判断一个时间点是否位于给定时间区间的方法

主要介绍了C#实现判断一个时间点是否位于给定时间区间的方法,涉及C#针对时间的转换与判定相关技巧,需要的朋友可以参考下
recommend-type

C语言实现输入一个字符串后打印出该字符串中字符的所有排列

主要介绍了C语言实现输入一个字符串后打印出该字符串中字符的所有排列的方法,是数学中非常实用的排列算法,需要的朋友可以参考下
recommend-type

C语言中查找字符在字符串中出现的位置的方法

主要介绍了C语言中查找字符在字符串中出现的位置的方法,分别是strchr()函数和strrchr()函数的使用,需要的朋友可以参考下
recommend-type

C语言实现扑克牌计算24点

主要为大家详细介绍了C语言如何实现扑克牌计算24点,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
recommend-type

k8s1.16的jenkins部署java项目cicd(cd手动)-kubernetes安装包和详细文档笔记整理

k8s1.16的jenkins部署java项目cicd(cd手动)-kubernetes安装包和详细文档笔记整理
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

MATLAB柱状图在信号处理中的应用:可视化信号特征和频谱分析

![matlab画柱状图](https://img-blog.csdnimg.cn/3f32348f1c9c4481a6f5931993732f97.png) # 1. MATLAB柱状图概述** MATLAB柱状图是一种图形化工具,用于可视化数据中不同类别或组的分布情况。它通过绘制垂直条形来表示每个类别或组中的数据值。柱状图在信号处理中广泛用于可视化信号特征和进行频谱分析。 柱状图的优点在于其简单易懂,能够直观地展示数据分布。在信号处理中,柱状图可以帮助工程师识别信号中的模式、趋势和异常情况,从而为信号分析和处理提供有价值的见解。 # 2. 柱状图在信号处理中的应用 柱状图在信号处理
recommend-type

用Spring boot和vue写一个登录注册界面

好的,这是一个比较常见的技术问题,我可以为您提供一些参考资料和思路。首先,您可以使用Spring Boot作为后端框架来处理用户认证和注册的逻辑,比如使用Spring Security实现用户登录认证。同时,您还需要设计相应的数据模型和数据库表结构来存储用户信息。在前端方面,您可以使用Vue.js作为框架来构建登录注册页面,使用Axios来发起API请求并和后端进行交互。当然,在实现过程中,还需要考虑一些具体细节,比如数据校验、安全性和用户体验等方面。希望这些信息能够帮助到您。
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。