暴力法解凸包

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了暴力法解凸包相关的知识,希望对你有一定的参考价值。

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

输入 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 }

 

以上是关于暴力法解凸包的主要内容,如果未能解决你的问题,请参考以下文章

导图整理数组2: 你还在用暴力法解 两数之和 吗? 力扣1

atcoder #082 E 暴力 计算几何

587. Erect the Fence(凸包算法)

HDU 4667 Building Fence(求凸包的周长)

旋转卡壳-求凸包最大直径

UVA10256 The Great Divide