凸包问题向来是计算几何中最重要的问题之一,许多各式各样的应用大多要么本身就是图凸包问题要么其中一部分需要按照凸包问题解决。

凸集合定义:对于平面上一个点集合,如果集合中的任意两点p和q为端点的线段都属于该集合,那么称这个集合为凸集合。

凸包定义:一个点集合S的凸包是包含S的最小凸集合。我们可以假设有一块板子,板子上面有许多钉子,用一根橡皮筋将所有的钉子都围住,凸包就是以橡皮筋圈为边界的区域。

在坐标平面上穿过两个点(x1, x2),(x2, y2)的直线方程为  ax+by = c (其中a = y2- y1, b = x1 - x2, c = x1y2 - y1x2)

上述方程基于两点式直线方程

由两个点连起来的直线会将平面分成两部分,其中半个平面的点都满足ax+by>c ,另一半平面中的点都满足ax+by<c ,对于线上的点来说满足ax+by=c。因此,算法的思路就是对于每个点带入ax+by-c,判断表达式结果的符号是否相同即可。

import java.util.*;class Point {int x;int y;public Point(int x, int y) {this.x = x;this.y = y;}@Overridepublic String toString() {return "Point{" +"x=" + x +", y=" + y +'}';}
}
public class Main {public static void main(String[] args) {Point[] points = new Point[6];List arr = new ArrayList();points[0] = new Point(1,3);points[1] = new Point(2,1);points[2] = new Point(3,5);points[3] = new Point(4,4);points[4] = new Point(5,2);points[5] = new Point(3,2);arr = outerTrees(points);Iterator it = arr.iterator();while (it.hasNext()) {System.out.println(it.next().toString() + " ");}}private static List<Point> outerTrees(Point[] points) {Set<Point> ans = new HashSet<>();/*** 只有一个点* */if (points.length == 1){ans.add(points[0]);return new ArrayList<>(ans);}for (int i = 0; i < points.length-1; i++){for (int j = i + 1; j < points.length; j++){int oneSide = 0;for (int k = 0; k < points.length; k++){if (k == i || k == j) {continue;}if (calcuTriangle(points[i], points[j], points[k]) > 0){oneSide++;}}if (oneSide == points.length-2 || oneSide == 0){ans.add(points[i]);ans.add(points[j]);}int otherSide = 0;for (int k = 0; k < points.length; k++){if (k == i || k == j) continue;if (calcuTriangle(points[i], points[j], points[k]) < 0){otherSide++;}}if (otherSide == points.length-2 || otherSide == 0){ans.add(points[i]);ans.add(points[j]);}}}return new ArrayList<>(ans);}private static int calcuTriangle(Point a1, Point a2, Point a3) {return a1.x * a2.y + a3.x * a1.y + a2.x * a3.y - a3.x * a2.y - a2.x * a1.y - a1.x * a3.y;}
}

蛮力法在求解凸包问题中的应用(JAVA)相关推荐

  1. 蛮力法在求解最优解问题中的应用(JAVA)--旅行家问题、背包问题、分配问题

    蛮力法在求解最优解问题中的应用 1.TSP(旅行商问题)要求我们找出一条n个给定城市之间的最短路径,使我们再回到出发的城市之前,对欧每个城市都只访问一次.我们可以用赋权图来描述这个问题,那么算法的目的 ...

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

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

  3. 蛮力法在字符串匹配问题中的应用(JAVA)--朴素模式匹配算法

    蛮力法在字符串匹配问题中的应用 字符串匹配问题通常是给定一个n个字符组成的串(称为文本),一个m(m<=n)个字符的串(称为模式),从文本中寻找匹配模式的子串.显然我们需要逐个匹配,这是蛮力算法 ...

  4. 算法分析:采用蛮力法(循环) 求解最大连续子序列和问题。给定一个有n(n≥1)个整数的序列,要求求出其中最大连续子序列的和。 例如: 序列(-2,11,-4,13,-5,-2)

    一.效果图 二.源代码 package sy4; import java.util.Scanner; /** * @author * */ public class Sy4_2 { static vo ...

  5. 蛮力法在求解“最近对”问题中的应用(JAVA)

    最近对问题是在计算几何问题中最简单的,是指在一个包含n个点的集合中,找到距离最近的两个点,我们这里只研究二维空间中的版本,高维计算基本类似,区别只在于计算两点之间距离的公式略有不同,下面是标准的欧几里 ...

  6. 算法 || 蛮力法【求解最大子序列和】#05

    求解最大子序列和 [问题描述] 给定一个有n个整数的序列,要求求出其中最大子序列的和 [问题求解] 如果扫描遇到负数,当前子序列和 thisSum 将会减小,若 thisSum 为负数,表明前面已经扫 ...

  7. 使用蛮力法求解数字迷问题(类似ABCAB*A = DDDDDD)

    蛮力法概述 蛮力法是一种简单直接地解决问题的方法,常常直接基于问题的描述>和所涉及的概念定义.是基于计算机运算速度快这一特性,在解决问题时采用的一种"懒惰"的策略.把问题的所 ...

  8. 蛮力法求解百元买百鸡问题

    蛮力法(brute force methord,也称穷举法或者枚举法)是一种简单直接地解决问题的方法,常常直接基于问题的描述.所以,蛮力法也是最容易应用的方法. 蛮力法所依赖的基本技术是遍历(trav ...

  9. 蛮力法在查找算法中的应用(JAVA)--顺序查找

    蛮力法在查找算法中的应用 对于查找算法来说,最简单的一个思路就是逐个匹配,直到找到目标元素 顺序查找: public class Main {public static void main(Strin ...

最新文章

  1. Java基础 - 面向对象 - 构造方法
  2. UICountingLabel实现数字变化的动画效果-b
  3. C语言不好应该转专业吗,转专业后对于C语言补修的一些体会(1)
  4. TensorFlow2-基础操作
  5. hihoCoder #1104 Suzhou Adventure
  6. 消息中间件ActiveMQ学习笔记(一):安装
  7. 物联网将如何影响你的钱包?
  8. 当前计算机技术与医学结合的研究热点,改进的模糊遗传算法在医学中的应用和研究...
  9. 程序员的电脑文件管理技巧
  10. 微信H5(WAP)支付,遇到的那些坑
  11. 编写c语言程序解一元一次方程,一元方程计算器1.0的代码(C语言实现)
  12. Unity打包APK多语言包名的适配
  13. 计算机硬件报警声音,电脑开机报警声音大全详解及处理
  14. 手把手教你绘制最基础的列线图
  15. matlab怎么表示对角阵,matlab – 如何基于每一行将矩阵转换为一堆对角矩阵?
  16. Mysql 索引存放位置
  17. 交换机 Port-Channel(端口汇聚)的 配置
  18. 微信开发者解除绑定微信公众号的方法,亲测有效
  19. 移动设备管理(MDM)与OMA(OTA)DM协议向导(一)——从WiMAX讲起
  20. HTML--onkeydown和onkeyup区别

热门文章

  1. mysql查看用户名_Mysql创建数据表的方法介绍(附示例)
  2. 前后落差大用什么词语_语文考题一共有五类:汉字类、词语类、句子类、阅读类、作文类,如果基础扎实,答题技巧弄懂了,哪一类都能拿高分!...
  3. java从键盘上录入学生人数和每个学生的姓名以及分数,按照分数降序输出,学生名次、学生姓名、学生分数
  4. html5 视频路径加密,HTML5视频路径混淆
  5. c语言中case1 case3 n =1,(n 1)-Step Derivations on n-Groupoids: The Case n = 3
  6. php mysql循环语句怎么写_mysql数据库循环语句该怎么写???
  7. Java - 计算不同字符或数字的个数
  8. 家用使用计算机组装,不能再简单了!家用电脑DIY组装实操
  9. 设计一个具有大纯时延时间的一阶惯性环节的计算机控制系统,具有一阶纯滞后环节设计.doc...
  10. 通过日志恢复oracle序列,(存档日志包含序列84,要求序列36)怎么恢复啊?