暴力法解凸包

给定平面上一系列的点,用暴力法求解它们的凸包,此算法比普通的暴力法要优化,用新找到的极点去寻找下一个极点。此算法不能用于任何两个点在一直线上的情况。

输入 ConvexHull.txt

7,8
10,17
14,14
15,23
16,12
17,3
22,17
24,4
26,18

C代码

 1 /*brute force solution to convex hull problem  */
 2 /*only limited to there is no point on the same line with any other point*/
 3 /*use the new extreme point to find the next*/
 4 #include<stdio.h>
 5 #include <stdlib.h>
 6 #include <math.h>
 7 #define MAX 100
 8 #define MAXDISTANCE 100000
 9 struct Point
10 {
11     int x;
12     int y;
13 } points[MAX];
14
15 int main()
16 {
17     FILE *fp;
18     if((fp=fopen("ConvexHull.txt","r"))==NULL)
19     {
20         printf("Cannot open file !");
21         exit(1);
22     }
23     int n=0;
24     int a=0;
25     int b=0;
26     int c=0;
27     int sign=0;
28     int cmp;//compare with sign
29     int point;
30
31     int count=0;
32     int start=-1;
33     int pre=-1;
34
35     while(!feof(fp))
36     {
37         fscanf(fp,"%d,%d",&points[n].x,&points[n].y);
38         n++;
39     }
40
41     int convexHull[n]= {-1};
42
43
44     for(int i=0; i<n; i++)
45         printf("No %d point:(%d,%d)\n",i+1,points[i].x,points[i].y);
46
47     int one=0;
48     int two=0;
49
50
51     while(one<n&&one!=start)
52     {
53         for(two=0; two<n; two++)//only calculate two=one;two<n is wrong, one‘s two can be smaller than one
54         {
55             if(one!=two&&two!=pre)
56             {
57                     a=points[two].y-points[one].y;
58                     b=points[one].x-points[two].x;
59                     c=points[one].x*points[two].y-points[one].y*points[two].x;
60                     sign=0;   //whether ax+by-c is postive or not
61                     for(point=0; point<n; point++)
62                         if(point!=one&&point!=two)
63                         {
64                             cmp=a*points[point].x+b*points[point].y-c; //cmp can be zero, if cmp is zero it‘s on the line,one and two are can be still extreme points
65
66                             if(sign==0)
67                                 sign=cmp;//if the first cmp is zero ,it can not be used for sign,thus sign will be assgined again
68                             else if(sign*cmp<0)
69                                 break;
70
71                         }
72                     if(point==n)//all points on the same side
73                     {
74                         //    printf("%d and %d are extreme points!\n",one,two);
75                         if(start==-1)
76                             start=one;
77                         printf("(%d,%d) is extreme point!\n",points[one].x,points[one].y);
78                         pre=one;
79                         one=two;//not all one will ++,some one depend on two but if there is no extreme point two then one will ++
80                         /*use the new extreme point to find the next*/
81                         break;
82                     }
83             }
84         }//for(two=0; two<n; two++)
85         if(two==n)
86             one++;
87     }
88
89
90     return 0;
91 }
时间: 2024-10-06 05:36:37

暴力法解凸包的相关文章

[NBUT 1224 Happiness Hotel 佩尔方程最小正整数解]连分数法解Pell方程

题意:求方程x2-Dy2=1的最小正整数解 思路:用连分数法解佩尔方程,关键是找出√d的连分数表示的循环节.具体过程参见:http://m.blog.csdn.net/blog/wh2124335/8871535 当d为完全平方数时无解 将√d表示成连分数的形式,例如: 当d不为完全平方数时,√d为无理数,那么√d总可以表示成: 记 当n为偶数时,x0=p,y0=q:当n为奇数时,x0=2p2+1,y0=2pq 求d在1000以内佩尔方程的最小正整数解的c++打表程序(正常跑比较慢,这个题需要离

暴力法求最小生成树

暴力法求最小生成树 5 71 2 22 5 21 3 41 4 73 4 12 3 13 5 6 我们采用的是dfs的回溯暴力,所以对于如下图,只能搜索到3条路,就是那种dfs的路. 思路: 暴力求最小生成树求这个图的最小生成树我就要看有多少个点被选进去了,vis数组就好,并且用个n来表示已经被选的点的个数 然后记录所以已经选了的路径和 1 #include <bits/stdc++.h> 2 #define INFINITE 0x3fffffff 3 using namespace std;

回溯法解背包问题分析

先亮出题目: 一,背包问题 及 回溯法解其问题的伪代码 二,赋值后的具体实例 三,如何看懂伪代码 (1)真正了解回溯法的核心思想 我总结的回溯法解题步骤: <1>先找出第一个解 <2>回溯 (2)回溯法核心思想 + 伪代码 + 图9-5 树结构来分析 四,伪代码代入值解析 核心:先找到第一个解,再回溯. cw=0;//背包当前重量 初始值 cp=0;//背包当前价值 初始值 k=1;//第一个物品 n=8;//共8个物品 W=110 第一步:得出第1个可行解: (1)k=1 k=1

Graham&#39;s Scan法求解凸包问题

概念 凸包(Convex Hull)是一个计算几何(图形学)中的概念.用不严谨的话来讲,给定二维平面上的点集,凸包就是将最外层的点连接起来构成的凸多边型,它能包含点集中所有点的.严谨的定义和相关概念参见维基百科:凸包. 这个算法是由数学大师葛立恒(Graham)发明的,他曾经是美国数学学会(AMS)主席.AT&T首席科学家以及国际杂技师协会(IJA)主席.(太汗了,这位大牛还会玩杂技~) 问题 给定平面上的二维点集,求解其凸包. 过程 1. 在所有点中选取y坐标最小的一点H,当作基点.如果存在多

POJ 1113 Wall 卷包裹法求凸包

Wall Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 31199   Accepted: 10521 Description Once upon a time there was a greedy King who ordered his chief Architect to build a wall around the King's castle. The King was so greedy, that he w

用二次规划法解带约束的线性回归

对于解带约束(线性约束)的线性回归通常的办法是,将约束直接表示在线性回归中,也就是减少一个变量(即回归到线性约束本身的自由变量数目).然而今天由于要解一个问题发现了另一种思路的解法,是比变换变量更为通用的办法,就是用二次规划法解带约束的线性回归. 二次规划法有如下一般形式: 各个部分为: 特别地如果约束条件为等号,则可以用拉格朗日乘子法直接求解.如果Q是不定矩阵,甚至有一个特征值是负数的,问题就是NP难问题.. 解决一个带约束的线性回归问题,形如: 需要求解最小化: 这个式子展开来写成矩阵形式就

Runge-Kutta法解微分方程

连续问题,微分方程或偏微分方程一定能表示.比如疾病传染.新闻传播等. 离散问题,可以用差分方程或者类似于差分的算法. 方程 $y'=cos t$ 代码 123456789 clear,clc; f = @(t,y) cos(t); tspan = [0,2*pi]; % 时间t范围y0 = 2; % y的初值,用来处理积分得到的C[t,y] = ode23(f,tspan,y0); % 注意调用格式plot(t,y);xlabel('t');ylabel('y'); @表示句柄,当把一个函数作为

暴力回溯法 解八皇后

国际象棋 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. public class _8Queen { //回溯法,暴力解8皇后 private static int ways = 0; //返回解法个数 public static int f8queen() { int[][] board = new int

python动态演示蛮力法解决凸包问题

最近开了算法课,但是我的算法着实不咋地,一直搞web和逆向,就没怎么编程.记录一下0.0 算法倒是不难实现,但是这个动态演示很烦,从纯粹的可视化小白,强行写完了,写完发现非常简单,只是自己不知道的函数太多了,哭了.... 蛮力法就不用解释了,通俗的说就是把所有可能试一遍. 凸包问题,就是将n个点中某几个点围成一个多边形,除了这n个点,其余的点都在这个多边形内. 核心算法其实就是一个行列式演变而来,后悔没学好线代..... 参考:https://blog.csdn.net/u011001084/a