凸包算法的蛮力实现
来源:互联网 发布:微信屏蔽淘宝链接 编辑:程序博客网 时间: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)的,应该是比较慢的,但对于处理小规模的数据还是没有问题,通过案例也可以看到,我的实现是没有什么问题的。
- 凸包算法的蛮力实现
- 凸包问题的Graham扫描算法实现
- Mahhout实现的算法、源码包分析
- Mahhout实现的算法、源码包分析
- 凸包Graham Scan算法实现
- 凸包GiftWrapping GrahamScan 算法实现
- 凸包Graham Scan算法实现
- 凸包Graham Scan算法实现
- 排序算法包实现
- 凸包算法(Graham算法)实现,带图形
- Warshall传递闭包算法的学习与实现
- 一种离散数学中求传递闭包的算法实现
- hadoop的MR如何实现动态替换算法包
- hadoop的MR如何实现动态替换算法包
- 用C语言实现发红包的软件算法
- Warshall传递闭包算法的学习与实现
- 发红包算法简单实现
- 凸包问题求解 使用蛮力算法
- Android使用VideoView播放网络视频
- 第三周项目4-这个时间玩的有意思
- 使用 ftrace 调试 Linux 内核,第 1 部分
- 微软为什么会让诺基亚生产安卓手机?
- java 调用C#的webservice
- 凸包算法的蛮力实现
- 拓胜第七十五天~~~~~~第八十五天
- 骚年你一定要学好英语之经典英文歌曲推荐
- 动态改变View的高宽
- WEB2.0标准教程: CSS布局入门
- 最短路--SPFA算法
- 黑马程序员___单例设计模式
- WEB2.0标准教程:第一个CSS布局实例
- Cocos2d-X 环境搭建 (Win7 + VS2013 + CO版本 3.0BETA2 ) 2014-3-10