在一个二维的花园中,有一些用 (x, y) 坐标表示的树。由于安装费用十分昂贵,你的任务是先用最短的绳子围起所有的树。只有当所有的树都被绳子包围时,花园才能围好栅栏。你需要找到正好位于栅栏边界上的树的坐标。
输入: [[1,1],[2,2],[2,0],[2,4],[3,3],[4,2]]
输出: [[1,1],[2,0],[4,2],[3,3],[2,4]]

    bool tmp(vector<int> &a, vector<int> &b)
{if (a[0]==b[0]) return a[1]<b[1];else return a[0]<b[0];
}
class Solution {//ABXAC
int cross(vector<int>&a,vector<int>&b,vector<int>&c){return (b[0]-a[0])*(c[1]-a[1])-(c[0]-a[0])*(b[1]-a[1]);
}
public:vector<vector<int>> outerTrees(vector<vector<int>>& trees) {sort(trees.begin(),trees.end(),tmp);int n = trees.size();vector<int>q(n+2,0);vector<bool>hasVisit(n,false);int nums = 0;q[++nums] = 0;for(int i=1;i<n;i++){vector<int> c = trees[i];while(nums>1){if(cross(trees[q[nums-1]],trees[q[nums]],c)>0){hasVisit[q[nums--]] = false;}else break;}q[++nums]=i;hasVisit[i]=true;}for(int i=n-1;i>=0;i--){if(hasVisit[i]) continue;vector<int> c = trees[i];while(nums>1){if(cross(trees[q[nums-1]],trees[q[nums]],c)>0){hasVisit[q[nums--]] = false;}else break;}q[++nums]=i;hasVisit[i]=true;}vector<vector<int>> res(nums-1);for (int i = 1; i < nums; ++i) res[i-1] = trees[q[i]];return res;}
};

判断是否在凸包内:
判断点P在多边形内部:根据向量叉乘,按照逆时针(顺时针)取向量进行叉乘,所得值同号,则说明点在多边形内部。

即判断方式为:取向量AB和AP、BC和BP、CD和CP、DE和DP、EA和EP进行叉乘,判断所得值是否同号。

二维凸包算法(Andrew算法)相关推荐

  1. matlab 凹包,二维点集凹包算法介绍

    最近遇到一个求二维点集凹包的问题,凹包的叫法不知道是否准确,问题可以描述为:(原文下载在文章末尾) 在二维平面上有一系列的点,求能包围所有点集的二维多边形.(好像搜"离散点边界"或 ...

  2. C++旋转二维MxN矩阵的算法(附完整源码)

    C++旋转二维MxN矩阵的算法 C++旋转二维MxN矩阵的算法完整源码(定义,实现,main函数测试) C++旋转二维MxN矩阵的算法完整源码(定义,实现,main函数测试) #include < ...

  3. 关于二维码分块上色(彩色二维码)的算法研究

    原文:关于二维码分块上色(彩色二维码)的算法研究 众所周知,二维码通常是黑白的,而且是由若干个长方形或正方形小块平铺而成.但从人们的审美角度来看,常见的黑白二维码不免让人审美疲劳.本文试着从分块上色的 ...

  4. 【转】二维异形件排版算法介绍(三)

    转自:https://bbs.huaweicloud.com/blogs/203947 [摘要] 相比于基于可行解的排样算法,重叠移除算法在改变解的状态时,允许零件之间发生重叠,然后采用分离技术消除重 ...

  5. 求二维形状渐变的算法

    如:三角形变成四边形.. 谁有这程序的源代码 ..好人呀你在哪? 课题名称  二维形状渐变对应算法 课题类型  理论研究 招收对象  计科 招收人数  1 课题要求  (1) 仔细阅读指定的若干篇相关 ...

  6. 二维码里德所罗门算法

    这是一个相当古老的项目了. 前序 之前一直想写一个有关二维码生成器的教程,由于各种各样的原因,当然主要原因是懒,一直没有下手.最近感觉还是要做点什么,不然有种要烂尾的冲动. 我之所以要写这个教程,主要 ...

  7. POJ 3348 Cows(二维凸包)

    题目链接:https://cn.vjudge.net/problem/POJ-3348 题意:有一些数,坐标已知,要用这些树作为篱笆的顶点圈一块多边形的地养牛,每头牛占地大小50,问最多能养多少头牛. ...

  8. 模板:二维凸包(计算几何)

    所谓凸包,就是一个凸出来的包 (逃) 前言 解析集合的第一课. 关键特征:周长最小.此时一定是凸包. 解析 定义 凸包:在平面上能包含所有给定点的最小凸多边形叫做凸包. 性质:凸包的周长是所有能包含给 ...

  9. POJ4449(三维凸包+空间坐标旋转+二维凸包)

    题目:Building Design 题意: 题目就是给了一个凸多面题. 要把这个凸多面体放到地上,一个面要接触到地面. 求一种放法,使得最高点最高,最高点相同时使投影面积最小.输出最高点高度H和投影 ...

  10. P2742 [USACO5.1]圈奶牛Fencing the Cows /【模板】二维凸包

    P2742 [USACO5.1]圈奶牛Fencing the Cows /[模板]二维凸包 题目: 给定一些点,问围住所有点所用的围栏的长度 题解: 凸包模板题 凸包详细 代码: #include&l ...

最新文章

  1. leetcode2. 两数相加--每天刷一道leetcode系列!
  2. [禅悟人生]每个人都可以获得自己的精彩
  3. 超棒的jQuery矢量地图生成插件 - JQVAMP
  4. 2017年如何在移动端优雅的使用flex
  5. matlab能做深度图像的识别吗,Matlab图像识别/检索系列(6)-10行代码完成深度学习网络之基于CNN的图像分类...
  6. Hadoop初级之Hadoop基本概念与应用前景
  7. PBRT中的误差舍入管理(浮点运算)
  8. polkit启动失败_linux某服务启动失败,提示Authorization not available. Check if polkit...问题解决...
  9. SIGCOMM 2010 论文 paper list
  10. Spring-beans-BeanPostProcessor/InitializingBean
  11. 2012年7月19日 解一元二次方程
  12. apk系统签名和发布软件签名的理解
  13. 浏览器的about:config清缓存及其他参数大全及其具体用途介绍
  14. linux系统配置Vim命令,怎么在LINUX操作系统中安装和配置VIM?
  15. windows - Hook技术介绍
  16. 【CVE】CVE-2015-5254:ActiveMQ 反序列化漏洞利用
  17. 3dmax中如何解决镜头穿透模型?
  18. 基于WEMOS的智能WiFi避障小车
  19. 手机网络专业测试软件,3个专业网速测试APP,免费无广告
  20. 太极阴,阳虚拟框架----各种插件大总结(烂尾)

热门文章

  1. C语言输出AB9798,c语言基础练习习题及答案.doc
  2. C++ 继承语法及修饰符
  3. 据所有独立的c文件生成相应执行文件通用Makefile
  4. 类加载器的理解——基于Launcher类
  5. SQLite之C++封装库CppSQLite使用方法
  6. 你所不知道的 AI 进展
  7. 学习自己动手设计数据库
  8. CSDN新版下载频道改版上线了
  9. mid制作乐谱_CuteMIDI简谱打谱软件(midi音乐制作器)V8.5.1 安装版
  10. 2010年c语言上机题库,2010年计算机c语言上机题库.doc