蛮力实现凸包算法,思路是相当简单的,每两个点形成一条边来看看他是否是边界线——即看其他的点是否都在这条边的左边或都在右边:下面就是我的算法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)的,应该是比较慢的,但对于处理小规模的数据还是没有问题,通过案例也可以看到,我的实现是没有什么问题的。