热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

平面中有若干个点,寻找距离最近的两个点,输出其编号

代码:1#include<iostream>2#include<vector>3#include<algorithm

代码:

  1 #include 
  2 #include 
  3 #include 
  4 #include 
  5 #include 
  6 #include 
  7 using namespace std;
  8 
  9 struct Point
 10 {
 11     double m_x, m_y;
 12     Point():m_x(0.0),m_y(0.0) {}
 13     Point(double x, double y):m_x(x),m_y(y) {}
 14     bool operator==(const Point& p) const
 15     {
 16         return m_x==p.m_x && m_y==p.m_y;
 17     }
 18 };
 19 
 20 ostream& operator<<(ostream& os, const Point& p)
 21 {
 22     return os <<"(" <"," <")";
 23 }
 24 template<class T, class Pr>
 25 void insert_sort(vector &vec, int l, int r, Pr pred)
 26 {
 27     int i, j;
 28     for (i=l+1; i<=r; i++)
 29     {
 30         T tmp = vec[i];
 31         for (j=i-1; j>=l && pred(tmp,vec[j]); j--)
 32             vec[j+1]=vec[j];
 33         vec[j+1] = tmp;
 34     }
 35 }
 36 template<class T>
 37 int get_position(vector &vec, int l, int r, T key)
 38 {
 39     for (int i=l; i<=r; i++)
 40         if (key == vec[i])
 41             return i;
 42     return -1;
 43 }
 44 template<class T, class Pr>
 45 int partition(vector &vec, int l, int r, Pr pred)
 46 {
 47     int i, j;
 48     for (i=l+1,j=l; i<=r; i++)
 49     {
 50         if (pred(vec[i],vec[l]))
 51         {
 52             ++j;
 53             swap(vec[i],vec[j]);
 54         }
 55     }
 56     swap(vec[j],vec[l]);
 57     return j;
 58 }
 59 
 60 template<class T, class Pr>
 61 T select(vector &vec, int l, int r, int k, Pr pred)
 62 {
 63     int n = r-l+1;
 64     if (n==1)
 65     {
 66         if (k!=0)
 67             printf("Out of Boundary!\n");
 68         return vec[l];
 69     }
 70     int cnt = n/5;
 71     int tcnt = (n+4)/5;
 72     int rem = n%5;
 73     vector group(tcnt);
 74     int i, j;
 75     for (i=0,j=l; i5)
 76     {
 77         insert_sort(vec, j, j+4, pred);
 78         group[i] = vec[j+2];
 79     }
 80     if (rem)
 81     {
 82         insert_sort(vec, j, j+rem-1, pred);
 83         group[i] = vec[j+(rem-1)/2];
 84     }
 85     T key = select(group, 0, tcnt-1, (tcnt-1)/2, pred);
 86 
 87     int key_pos = get_position(vec, l, r, key);
 88     swap(vec[key_pos], vec[l]);
 89     int pos = partition(vec, l, r, pred);
 90     int x = pos - l;
 91     if (x == k) return key;
 92     else if (x < k)
 93         return select(vec, pos+1, r, k-x-1, pred);
 94     else
 95         return select(vec, l, pos-1, k, pred);
 96 }
 97 double dist(const Point& a, const Point& b)
 98 {
 99     double x = a.m_x-b.m_x;
100     double y = a.m_y-b.m_y;
101     return sqrt(x*x+y*y);
102 }
103 
104 bool cmpX(const Point& a, const Point& b)
105 {
106     return a.m_x < b.m_x;
107 }
108 
109 bool cmpY(const Point& a, const Point& b)
110 {
111     return a.m_y < b.m_y;
112 }
113 
114 double minDifferent(vector p, int l, int r, vector &result)
115 {
116     if ((r-l+1)==2)
117     {
118         result[0] = p[l];
119         result[1] = p[r];
120         if (cmpX(p[r],p[l])) swap(p[l], p[r]);
121         return dist(p[l], p[r]);
122     }
123     if ((r-l+1)==3)
124     {
125         insert_sort(p, l, r, cmpX);
126         double tmp1 = dist(p[l], p[l+1]);
127         double tmp2 = dist(p[l+1], p[l+2]);
128         double ret = min(tmp1, tmp2);
129         if (tmp1 == ret)
130         {
131             result[0] = p[l];
132             result[1] = p[l+1];
133         }
134         else
135         {
136             result[0] = p[l+1];
137             result[1] = p[l+2];
138         }
139         return ret;
140     }
141     int mid = (r+l)>>1;
142     Point median = select(p, l, r, mid-l, cmpX);
143     vector res1(2), res2(2);
144     double min_l = minDifferent(p, l, mid, res1);
145     double min_r = minDifferent(p, mid+1, r, res2);
146     double minum = min(min_l, min_r);
147     if (minum == min_l)
148     {
149         result[0] = res1[0];
150         result[1] = res1[1];
151     }
152     else
153     {
154         result[0] = res2[0];
155         result[1] = res2[1];
156     }
157     vector yvec;
158     int i, j;
159     for (i=mid+1; i<=r; i++)
160         if (p[i].m_x - p[mid].m_x < minum)
161             yvec.push_back(Point(p[i]));
162     for (i=mid; i>=l; i--)
163         if (p[mid+1].m_x - p[i].m_x < minum)
164             yvec.push_back(Point(p[i]));
165     sort(yvec.begin(), yvec.end(), cmpY);
166     for (i=0; i)
167     {
168         for (j=i+1; j169                 j<=i+7; j++)
170         {
171             double delta = dist(yvec[i],yvec[j]);
172             if (delta < minum)
173             {
174                 minum = delta;
175                 result[0] = yvec[i];
176                 result[1] = yvec[j];
177             }
178         }
179     }
180     return minum;
181 }
182 
183 int main()
184 {
185     int n, i, j;
186     double x, y;
187     int k = 0;
188     map<int,Point> m;
189     vector result(2);
190     vector input;
191     cin >> n;
192     for (i=0; i)
193     {
194         cin >> x;
195         cin >> y;
196         input.push_back(Point(x,y));
197         m.insert(pair<int,Point>(k,Point(x,y)));
198         k++;
199     }
200     double minum = minDifferent(input, 0, input.size()-1, result);
201 
202     for(map<int,Point>::iterator it = m.begin();it != m.end();it++)
203     {
204         if(it->secOnd== result[0])
205         {
206             cout<first;
207         }
208         if(it->secOnd== result[1])
209         {
210             cout<<" "<first;
211         }
212     }
213 
214 
215     return 0;
216 }
View Code

 


推荐阅读
  • 使用方法:将要控制的角色拖到TargetBody,将相机的焦点拖到CamerPivot,,建议CameraPivot是一个放在TargetBody下的子物体,并且位置应该是在Tar ... [详细]
  • 在OpenShift上部署基于MongoDB和Node.js的多层应用程序
    本文档详细介绍了如何在OpenShift 4.x环境中部署一个包含MongoDB数据库和Node.js后端及前端的多层应用程序。通过逐步指导,读者可以轻松完成整个部署过程。 ... [详细]
  • 一个建表一个执行crud操作建表代码importandroid.content.Context;importandroid.database.sqlite.SQLiteDat ... [详细]
  • MySQL初级篇——字符串、日期时间、流程控制函数的相关应用
    文章目录:1.字符串函数2.日期时间函数2.1获取日期时间2.2日期与时间戳的转换2.3获取年月日、时分秒、星期数、天数等函数2.4时间和秒钟的转换2. ... [详细]
  • C#实现文件的压缩与解压
    2019独角兽企业重金招聘Python工程师标准一、准备工作1、下载ICSharpCode.SharpZipLib.dll文件2、项目中引用这个dll二、文件压缩与解压共用类 ... [详细]
  • IOS Run loop详解
    为什么80%的码农都做不了架构师?转自http:blog.csdn.netztp800201articledetails9240913感谢作者分享Objecti ... [详细]
  • 本文介绍了在 Java 编程中遇到的一个常见错误:对象无法转换为 long 类型,并提供了详细的解决方案。 ... [详细]
  • 零拷贝技术是提高I/O性能的重要手段,常用于Java NIO、Netty、Kafka等框架中。本文将详细解析零拷贝技术的原理及其应用。 ... [详细]
  • [转]doc,ppt,xls文件格式转PDF格式http:blog.csdn.netlee353086articledetails7920355确实好用。需要注意的是#import ... [详细]
  • 思科IOS XE与ISE集成实现TACACS认证配置
    本文详细介绍了如何在思科IOS XE设备上配置TACACS认证,并通过ISE(Identity Services Engine)进行用户管理和授权。配置包括网络拓扑、设备设置和ISE端的具体步骤。 ... [详细]
  • 本地存储组件实现对IE低版本浏览器的兼容性支持 ... [详细]
  • 在软件开发过程中,经常需要将多个项目或模块进行集成和调试,尤其是当项目依赖于第三方开源库(如Cordova、CocoaPods)时。本文介绍了如何在Xcode中高效地进行多项目联合调试,分享了一些实用的技巧和最佳实践,帮助开发者解决常见的调试难题,提高开发效率。 ... [详细]
  • 本文介绍了如何使用 Node.js 和 Express(4.x 及以上版本)构建高效的文件上传功能。通过引入 `multer` 中间件,可以轻松实现文件上传。首先,需要通过 `npm install multer` 安装该中间件。接着,在 Express 应用中配置 `multer`,以处理多部分表单数据。本文详细讲解了 `multer` 的基本用法和高级配置,帮助开发者快速搭建稳定可靠的文件上传服务。 ... [详细]
  • 属性类 `Properties` 是 `Hashtable` 类的子类,用于存储键值对形式的数据。该类在 Java 中广泛应用于配置文件的读取与写入,支持字符串类型的键和值。通过 `Properties` 类,开发者可以方便地进行配置信息的管理,确保应用程序的灵活性和可维护性。此外,`Properties` 类还提供了加载和保存属性文件的方法,使其在实际开发中具有较高的实用价值。 ... [详细]
  • Python 伦理黑客技术:深入探讨后门攻击(第三部分)
    在《Python 伦理黑客技术:深入探讨后门攻击(第三部分)》中,作者详细分析了后门攻击中的Socket问题。由于TCP协议基于流,难以确定消息批次的结束点,这给后门攻击的实现带来了挑战。为了解决这一问题,文章提出了一系列有效的技术方案,包括使用特定的分隔符和长度前缀,以确保数据包的准确传输和解析。这些方法不仅提高了攻击的隐蔽性和可靠性,还为安全研究人员提供了宝贵的参考。 ... [详细]
author-avatar
漫步乡间2012
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有