1.代码

#include <iostream>
using namespace std;
#include <windows.h>
#include <algorithm>
#include <stdlib.h>
#define N 10000
int n = 0;struct point
{int x, y;
}p[N],ans[N];//p[N]是存储原始的点集,ans[N]存储结果的极点int visit[N],mark[N];//第一步:排序
//排序,如果,横坐标相同,则按照纵坐标排序
int cmpxy(point a,point b)
{if(a.x!=b.x)return a.x<b.x;elsereturn a.y<b.y;
}
//第二步:计算三角形面积int Djudge(point a1, point a2, point a3)//计算三个点组成的三角形面积
{int calculate = a1.x*a2.y + a3.x*a1.y + a2.x*a3.y - a3.x*a2.y - a2.x*a1.y - a1.x*a3.y;return calculate;
}//第三步、找到一个点Pmax,使三角形P0-Pmax-Pn-1面积最大,
//也就是距离直线P1Pn-1最远的点。函数deal(first,last),
//first代表直线最小的点即p[0],last代表直线最大的点,即[n-1]。
//寻找pmax点,就是面积最大时的点,放进mark数组,即他们就是凸包的点,递归求解。
void DealLeft(int first, int last)
{int max = 0, index = -1;int i = first;if (first < last){for (i = first+1; i < last; i++) //注意两端,对于first和last,没必要再进行计算{int calcu = Djudge(p[first], p[i], p[last]);//计算三个点的面积if (calcu == 0) {  visit[i] = 1; } //该点在直线上if (calcu > max){max = calcu;index = i;}}}else{for (i-1; i >last; i--) //如果first>last,重复上述过程,注意这里下界不是0.{int calcu = Djudge(p[first], p[i], p[last]);if (calcu == 0) {visit[i] = 1;} //if (calcu >  max){max = calcu;index = i;}}}if (index != -1)//找到了凸包上的点{visit[index] = 1; //对取到的点进行标注  DealLeft(first, index);DealLeft(index, last);//分治的部分}
}int main()
{cout<<"请输入点数:"<<endl;cin >> n;cout<<"请输入点的坐标:"<<endl;for (int i = 0; i < n; i++){cin >> p[i].x >> p[i].y;visit[i] = 0;}visit[0] = 1; //最左边的点和最右边点visit[n - 1] = 1;sort(p, p + n, cmpxy);//排序DealLeft(0, n - 1); //查找上凸包;DealLeft(n - 1, 0); //查找下凸包;int t = 0;for (int i = 0; i < n; i++){if (visit[i] == 1){ans[t].x = p[i].x;ans[t].y = p[i].y;t++;}}//顺时针输出mark[0] = mark[t - 1] = 1; //数组mark避免重复检查降低效率for (int i = 1; i < t - 1; i++){mark[i] = 0;}cout<<"凸包点的坐标:"<<endl;cout << ans[0].x << " " <<ans[0].y<< endl; //最左边的点for (int i =1; i < t-1; i++)   //上凸包的极点{int d = Djudge(ans[0], ans[t-1], ans[i]);if (d >= 0){cout << ans[i].x << " " << ans[i].y << endl;mark[i] = 1;}}cout << ans[t - 1].x << " " << ans[t - 1].y << endl;//最右边的点for (int i = 1; i < t; i++)//下凸包的极点{if (mark[i] != 1){int d = Djudge(ans[0], ans[t - 1], ans[i]);if (d < 0){cout << ans[i].x << " " << ans[i].y << endl;}}}Sleep(80000);return 0;
}

2.结果示例

分治法(03几何问题)凸包问题相关推荐

  1. 分治法在求解凸包问题中的应用(JAVA)--快包算法

    分治法在求解凸包问题中的应用(JAVA) 之前写过一篇蛮力法在求解凸包问题中的应用(JAVA)还算简单易懂,没有基础的读者最好先去阅读以下. 这里用分治法来求解凸包问题,由于这个算法和快速排序十分相似 ...

  2. 学习Jonathan Shewchuk的Triangle:分治法中三角形的几何信息和拓扑信息的操作

    介绍 想必研究网格细分技术的同学们不会不知道Jonathan Richard Shewchuk,凭借作品Triangle获得了2003年数值计算软件威尔金森奖.先拿下他的图来镇下楼(图片出自:点击打开 ...

  3. 分治法解决计算凸包问题

    清华大学的邓俊辉老师的<计算几何>公开课中,在计算凸包问题时会遇到极点法和极边法: 极点法是假设所有的点都是凸包上的点,然后根据In-triangle测试,把去除不是极点的点,时间复杂度是 ...

  4. 凸包问题 分治法求解

    问题介绍 给定平面上一些点的集合,找到一些点,使得这些点形成一个凸的包围,围住所有的点,如图 思路 采用分治法,将点集合一分为二,整体的凸包问题可以分为[求上半部分的凸包]+[求下半部分的凸包] 分策 ...

  5. 快包_分治法求解凸包问题

    凸包问题(分治法) 题目简述 P2742 [USACO5.1]圈奶牛Fencing the Cows   农夫约翰想要建造一个围栏用来围住他的奶牛,可是他资金匮乏.他建造的围栏必须包括他的奶牛喜欢吃草 ...

  6. 分治法实验之大整数乘法(算法设计分析)

    分治法实验之大整数乘法 01. 问题描述 02. 输入格式 03. 输出格式 04. 输入样例 05. 输出样例 06. 问题分析 07. 算法设计 08. 代码实现 09. 测试结果 10. 复杂度 ...

  7. 分治法-最接近点对问题

    背景: 计算机应用中经常采用点.圆等简单的几何对象表示物理实体,常需要了解其邻域中其他几何对象的信息 例如:在空中交通控制中,若将飞机作为空间中的一个点来处理,则具有最大碰撞危险的两架飞机所处的点对, ...

  8. Cryp.1.大整数相乘---分治法

    from:2017 CCF计算机课程改革导教班. 陈道蓄 11 大整数相乘 – 比长乘更快 小学里就教过整数乘的算法.要计算两个正整数a,b的乘积,你用b中每一位依次乘a,并将结果逐行排列,按b的相应 ...

  9. 算法设计与分析——分治法

    主要思想 (其实有这个思想也想不出来): 1.划分:整个问题划分成多个子问题 2.求解:求解各子问题的解 3.合并:合并子问题的解 (手说:"我会了",脑子:"不会&qu ...

最新文章

  1. tez 0.9.0 配置
  2. WINCE+6410 拨号上网
  3. 初等数学O 集合论基础 第六节 商集
  4. latex文档的优点和使用小tips
  5. ipad xcode连接不了iPad的。
  6. IOS 定义手势监听器详解,利用 UIGestureRecognizer 进行捏合、旋转、平移、点击、长按手势事件响应
  7. 7-36 并查集【模板】 (10 分)
  8. poj 2395 prime的递归实现
  9. 台积电今年9月营收达302.1亿元 同比增长24.9%
  10. 2017CCPC哈尔滨 A:Palindrome(manacher+树状数组)
  11. 8.Docker技术入门与实战 --- 使用Dockerfile创建镜像
  12. treetable怎么带参数_Layui实现TreeTable(树形数据表格)
  13. netware 6.5的故障解决
  14. 在JS中控制键盘输入 delete键、backspace键、enter键(涉及JSP、JQuery)及其他键
  15. 从零开始学习C语言开发视频教程在线完整版
  16. 史上最全的Win8快捷键大全
  17. 给每个物品一张“身份证”
  18. 【Practical】决策系统与粗糙集
  19. 接口测试(二)接口测试用例设计
  20. 高等工程数学 —— 第一章 (1)距离与范数

热门文章

  1. 【逆向】UPX工具使用及加壳
  2. ../../../assetsets/image/***.png in ./node_modules/cache-loader/dist/cjs.js解决方法(重新手写引入)
  3. 制作APP?零编程积木式搭建,在应用公园就是真么简单
  4. mongoTemplate的多表关联查询
  5. 一个C/C++程序的一生:从源程序到可执行程序再到进程
  6. 英特尔NUC 11板载USB3.0座子接口定义
  7. 思科模拟器实验10:标准ACL配置
  8. MySQL数据库表引擎与字符集
  9. iOS中的多态是什么?
  10. SpringBoot - Log4j2异步日志