分治法求解最近对问题(c++)
| #include"stdafx.h" #include<iostream> #include<cmath> #define TRUE 1 #define FALSE 0 using namespace std; typedef struct Node//坐标点 {  double x;  double y; }Node;   typedef struct List {  Node* data;      //点  int count;      //点的个数 }List; typedef struct CloseNode {  Node a;  Node b;     //计算距离的两个点  double space;     //距离平方 }CloseNode; int n;     //点的数目 //输入各点到List中 void create(List &L) {  cout << "请输入平面上点的数目:\n";  cin >> n;  L.count = n;  L.data = new Node[L.count];      //动态空间分配  cout << "输入各点坐标 :x_y):" << endl;  for (int i = 0; i<L.count; ++i)   cin >> L.data[i].x >> L.data[i].y; } //求距离的平方 double square(Node a, Node b) {  return ((a.x - b.x)*(a.x - b.x)) + ((a.y - b.y)*(a.y - b.y)); } //冒泡排序 void BubbleSort(Node r[], int length) {  int change, n;  n = length; change = TRUE;  double b, c;  for (int i = 0; i<n - 1 && change; ++i)  {   change = FALSE;   for (int j = 0; j<n - i - 1; ++j)   {    if (r[j].x>r[j + 1].x)    {     b = r[j].x; c = r[j].y;     r[j].x = r[j + 1].x; r[j].y = r[j + 1].y;     r[j + 1].x = b; r[j + 1].y = c;     change = TRUE;    }   }  } } //分治法中先将坐标按X轴从小到大的顺序排列 void paixu(List L) {  BubbleSort(L.data, L.count);   //调用冒泡排序 } //左右各距中线d的区域的最近对算法 void middle(const List & L, CloseNode &cnode, int mid, double midX) {  int i, j;    //分别表示中线左边,右边的点  double d = sqrt(cnode.space);  i = mid;  while (i >= 0 && L.data[i].x >= (midX - d))    //在左边的d区域内  {   j = mid;   while (L.data[++j].x <= (midX + d) && j <= L.count)    //在右边的d区域内   {    if (L.data[j].y<(L.data[i].y - d) || L.data[j].y>(L.data[i].y + d))   //判断纵坐标是否在左边某固定点的2d区域内     continue;    double space = square(L.data[i], L.data[j]);    if (cnode.space>space)    //在满足条件的区域内依次判断    {     cnode.a = L.data[i];     cnode.b = L.data[j];     cnode.space = space;    }   }   --i;  } } //分治法求最近对 void DivideConquer(const List &L, CloseNode &closenode, int begin, int end) {  if (begin != end)  {   int mid = (begin + end) / 2;     //排列后的中间的那个点   double midX = L.data[mid].x;   DivideConquer(L, closenode, begin, mid);      //继续在左半边用分治法求最近对   DivideConquer(L, closenode, mid + 1, end);      //继续在右半边用分治法求最近对   middle(L, closenode, mid, midX);               //判断左右各距中线d的区域,是否有最近对  } } void main() {  //初始化  List list;  CloseNode closenode;  closenode.space = 10000;      create(list);      cout << "各点坐标为:" << endl;  for (int i = 0; i<list.count; ++i)   cout << "X=" << list.data[i].x << "   Y=" << list.data[i].y << "\n";  cout << "用分治法求最近对:" << endl;  paixu(list);  cout << "经过排序后的各点:" << endl;  for (int j = 0; j<list.count; ++j)   cout << "X=" << list.data[j].x << "   Y=" << list.data[j].y << "\n";  DivideConquer(list, closenode, 0, list.count - 1);  cout << "最近对为点 (" << closenode.a.x << "," << closenode.a.y << ")和点(" << closenode.b.x << "," << closenode.b.y << ")\n" << "最近距离为: " << sqrt(closenode.space) << endl; } | 
分治法求解最近对问题(c++)的更多相关文章
- [C++] 分治法之棋盘覆盖、循环赛日程表
		一.分治的基本思想 将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之. 对于一个规模为 n 的问题,若问题可以容易地解决,则直接解决,否则将其分解为 k 个规模较小的子 ... 
- Java算法——分治法
		一.基本概念 在计算机科学中,分治法是一种很重要的算法.字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简 ... 
- 分治法避免定义多个递归函数,应该使用ResultType
		总结:对二叉树应用分治法时,应避免定义多个递归函数,当出现需要递归求解多种的结果时,尽量使用ResultType来让一次递归返回多种结果. 题目:Binary Tree Maximum Path Su ... 
- 分治法(一)(zt)
		这篇文章将讨论: 1) 分治策略的思想和理论 2) 几个分治策略的例子:合并排序,快速排序,折半查找,二叉遍历树及其相关特性. 说明:这几个例子在前面都写过了,这里又拿出来,从算法设计的策略的角度把它 ... 
- p1257 平面上最接近点对---(分治法)
		首先就是一维最接近点的情况... #include<iostream> #include<cstdio> #include<cstring> #include< ... 
- 分治法及其python实现例子
		在前面的排序算法学习中,归并排序和快速排序就是用的分治法,分治法作为三大算法之一的,有非常多的应用例子. 分治法概念 将一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题-- ... 
- 分治法 - Divide and Conquer
		在计算机科学中,分治法是一种很重要的算法.分治法即『分而治之』,把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的 ... 
- poj 3714 Raid【(暴力+剪枝) || (分治法+剪枝)】
		题目: http://poj.org/problem?id=3714 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=27048#prob ... 
- python编写PAT 1007 Maximum Subsequence Sum(暴力 分治法 动态规划)
		python编写PAT甲级 1007 Maximum Subsequence Sum wenzongxiao1996 2019.4.3 题目 Given a sequence of K integer ... 
随机推荐
- Fis3前端工程化之项目实战
			Fis3项目 项目目录结构: E:. │ .gitignore │ fis-conf.js │ index.html │ package.json │ README.md │ ├─material │ ... 
- Elasticsearch 5.0 中term 查询和match 查询的认识
			Elasticsearch 5.0 关于term query和match query的认识 一.基本情况 前言:term query和match query牵扯的东西比较多,例如分词器.mapping ... 
- 通过重建Hosting系统理解HTTP请求在ASP.NET Core管道中的处理流程[下]:管道是如何构建起来的?
			在<中篇>中,我们对管道的构成以及它对请求的处理流程进行了详细介绍,接下来我们需要了解的是这样一个管道是如何被构建起来的.总的来说,管道由一个服务器和一个HttpApplication构成 ... 
- redis集成到Springmvc中及使用实例
			redis是现在主流的缓存工具了,因为使用简单.高效且对服务器要求较小,用于大数据量下的缓存 spring也提供了对redis的支持: org.springframework.data.redis.c ... 
- VSCode调试go语言出现:exec: "gcc": executable file not found in %PATH%
			1.问题描述 由于安装VS15 Preview 5,搞的系统由重新安装一次:在用vscdoe编译go语言时,出现以下问题: # odbcexec: "gcc": executabl ... 
- 开发者的利器:Docker 理解与使用
			困扰写代码的机器难免会被我们安装上各种各样的开发工具.语言运行环境和引用库等一大堆的东西,长久以来不仅机器乱七八糟,而且有些相同的软件还有可能会安装不同的版本,这样又会导致一个项目正常运行了,却不小心 ... 
- 漫谈TCP
			不得不承认,tcp是一个非常复杂的协议.它包含了RFC793及之后的一些协议.能把tcp的所有方面面面具到地说清楚,本身就是个很复杂的事情.如果再讲得枯燥,那么就会更让人昏昏欲睡了.本文希望能尽量用稍 ... 
- Android Socket连接PC出错问题及解决
			最近测试问题:Android 通过Socket链接电脑,ip和端口都是正确的,也在同一网段,可android端就是报异常如下: 解决办法:测试电脑的防火墙可能开着,在控制面板把防火墙打开即可. 
- ILJMALL project过程中遇到Fragment嵌套问题:IllegalArgumentException: Binary XML file line #23: Duplicate id
			出现场景:当点击"分类"再返回"首页"时,发生error退出 BUG描述:Caused by: java.lang.IllegalArgumentExcep ... 
- jQuery中取消后续执行内容
			<html xmlns="http://www.w3.org/1999/xhtml"><head> <title></title&g ... 
