凸包算法的蛮力实现

来源:互联网 发布:微信屏蔽淘宝链接 编辑:程序博客网 时间:2024/06/07 01:42

 蛮力实现凸包算法,思路是相当简单的,每两个点形成一条边来看看他是否是边界线——即看其他的点是否都在这条边的左边或都在右边:下面就是我的算法C++实现:

 

#include<iostream>

#include<vector>

using namespace std;

struct point

{

  intx;

  inty;

   point(int xx=0,int yy=0):x(xx),y(yy){}

};

void TUB(vector<point>&v)

{

   int siz=v.size();

  for(int i=0;i<siz-1;i++)

      for(int j=i+1;j<siz;j++)

      {

          int A=v[j].y-v[i].y;

          int B=v[i].x-v[j].x;

          int C=-v[i].x*A-v[i].y*B;

          bool flag1=false,flag2=false;

          for(int k=0;k<siz;k++)

          {

               if(A*v[k].x+B*v[k].y+C>0)

                   flag1=true;

               elseif(A*v[k].x+B*v[k].y+C<0)

                   flag2=true;

          }

                     if((flag1&&!flag2)||(!flag1&&flag2))

                            {

                                     cout<<"{("<<v[i].x<<","<<v[i].y<<");";

                 cout<<"("<<v[j].x<<","<<v[j].y<<")}  ";

                            }

       

                      }

 

   

 

}

int main(){

 

   int m,a,b;

    while(cin>>m)

    {

       vector<point>V;

       while(m--)

       {

           cin>>a>>b;

           point tmp(a,b);

           V.push_back(tmp);

 

       }

    cout<<"输入的点所形成的凸包为:"<<endl;

       TUB(V);

                   cout<<endl;

    }

return 0;

}

/*

测试案例:

5

0 0

1 0

0 1

-1 0

0 -1

输入的点所形成的凸包为:

{ (1,0); (0,1)}  { (1,0); (0,-1)}  { (0,1); (-1,0)}  { (-1,0); (0,-1)}

 

*/

可以看到,核心就是函数TUB()里的三个for循环,前两个循环是找两个点形成一条边,后面的for循环是用来判断其他的点是否都在这条直线的其中一边.所以这个算法的效率是O(n^3)的,应该是比较慢的,但对于处理小规模的数据还是没有问题,通过案例也可以看到,我的实现是没有什么问题的。

0 0
原创粉丝点击