分治法(03几何问题)凸包问题
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几何问题)凸包问题相关推荐
- 分治法在求解凸包问题中的应用(JAVA)--快包算法
分治法在求解凸包问题中的应用(JAVA) 之前写过一篇蛮力法在求解凸包问题中的应用(JAVA)还算简单易懂,没有基础的读者最好先去阅读以下. 这里用分治法来求解凸包问题,由于这个算法和快速排序十分相似 ...
- 学习Jonathan Shewchuk的Triangle:分治法中三角形的几何信息和拓扑信息的操作
介绍 想必研究网格细分技术的同学们不会不知道Jonathan Richard Shewchuk,凭借作品Triangle获得了2003年数值计算软件威尔金森奖.先拿下他的图来镇下楼(图片出自:点击打开 ...
- 分治法解决计算凸包问题
清华大学的邓俊辉老师的<计算几何>公开课中,在计算凸包问题时会遇到极点法和极边法: 极点法是假设所有的点都是凸包上的点,然后根据In-triangle测试,把去除不是极点的点,时间复杂度是 ...
- 凸包问题 分治法求解
问题介绍 给定平面上一些点的集合,找到一些点,使得这些点形成一个凸的包围,围住所有的点,如图 思路 采用分治法,将点集合一分为二,整体的凸包问题可以分为[求上半部分的凸包]+[求下半部分的凸包] 分策 ...
- 快包_分治法求解凸包问题
凸包问题(分治法) 题目简述 P2742 [USACO5.1]圈奶牛Fencing the Cows 农夫约翰想要建造一个围栏用来围住他的奶牛,可是他资金匮乏.他建造的围栏必须包括他的奶牛喜欢吃草 ...
- 分治法实验之大整数乘法(算法设计分析)
分治法实验之大整数乘法 01. 问题描述 02. 输入格式 03. 输出格式 04. 输入样例 05. 输出样例 06. 问题分析 07. 算法设计 08. 代码实现 09. 测试结果 10. 复杂度 ...
- 分治法-最接近点对问题
背景: 计算机应用中经常采用点.圆等简单的几何对象表示物理实体,常需要了解其邻域中其他几何对象的信息 例如:在空中交通控制中,若将飞机作为空间中的一个点来处理,则具有最大碰撞危险的两架飞机所处的点对, ...
- Cryp.1.大整数相乘---分治法
from:2017 CCF计算机课程改革导教班. 陈道蓄 11 大整数相乘 – 比长乘更快 小学里就教过整数乘的算法.要计算两个正整数a,b的乘积,你用b中每一位依次乘a,并将结果逐行排列,按b的相应 ...
- 算法设计与分析——分治法
主要思想 (其实有这个思想也想不出来): 1.划分:整个问题划分成多个子问题 2.求解:求解各子问题的解 3.合并:合并子问题的解 (手说:"我会了",脑子:"不会&qu ...
最新文章
- tez 0.9.0 配置
- WINCE+6410 拨号上网
- 初等数学O 集合论基础 第六节 商集
- latex文档的优点和使用小tips
- ipad xcode连接不了iPad的。
- IOS 定义手势监听器详解,利用 UIGestureRecognizer 进行捏合、旋转、平移、点击、长按手势事件响应
- 7-36 并查集【模板】 (10 分)
- poj 2395 prime的递归实现
- 台积电今年9月营收达302.1亿元 同比增长24.9%
- 2017CCPC哈尔滨 A:Palindrome(manacher+树状数组)
- 8.Docker技术入门与实战 --- 使用Dockerfile创建镜像
- treetable怎么带参数_Layui实现TreeTable(树形数据表格)
- netware 6.5的故障解决
- 在JS中控制键盘输入 delete键、backspace键、enter键(涉及JSP、JQuery)及其他键
- 从零开始学习C语言开发视频教程在线完整版
- 史上最全的Win8快捷键大全
- 给每个物品一张“身份证”
- 【Practical】决策系统与粗糙集
- 接口测试(二)接口测试用例设计
- 高等工程数学 —— 第一章 (1)距离与范数
热门文章
- 【逆向】UPX工具使用及加壳
- ../../../assetsets/image/***.png in ./node_modules/cache-loader/dist/cjs.js解决方法(重新手写引入)
- 制作APP?零编程积木式搭建,在应用公园就是真么简单
- mongoTemplate的多表关联查询
- 一个C/C++程序的一生:从源程序到可执行程序再到进程
- 英特尔NUC 11板载USB3.0座子接口定义
- 思科模拟器实验10:标准ACL配置
- MySQL数据库表引擎与字符集
- iOS中的多态是什么?
- SpringBoot - Log4j2异步日志