Graham算法的实现
来源:互联网 发布:国际版的中国软件 编辑:程序博客网 时间:2024/06/13 15:27
算法思路源自于《算法导论》的计算几何章节,并用此算法解决zoj 1453
#include<iostream>#include<vector>#include<algorithm>#include<math.h>#include<fstream>#include<stack>using namespace std;int infinite = 1000;point s;double cross_mul_1(point p0,point p1,point pi){ return (p1.x-p0.x)*(pi.y - p1.y) - (p1.y-p0.y)*(pi.x - p1.x);}bool cmp(const point& p1,const point& p2){ double co1 = (p1.x - s.x) / pow((pow(p1.x - s.x,2.0)+pow(p1.y - s.y,2.0)),0.5) ; double co2 = (p2.x - s.x) / pow((pow(p2.x - s.x,2.0)+pow(p2.y - s.y,2.0)),0.5) ; if(co1>co2) return true; else if(co1 == co2){ double d1 = pow(p1.x - s.x,2.0)+pow(p1.y-s.y,2.0); double d2 = pow(p2.x - s.x,2.0)+pow(p2.y-s.y,2.0); //在次将同一直线上的最远的点放在更前面,为了后面编程方便 return d1 > d2; } return false;}void graham(){ ifstream cin("1.txt"); int n,i,x,y; cin>>n; vector<point> v; double minY = infinite ,minX = infinite ,tx,ty; for( i=0;i<n;++i){ point p; cin>>x>>y; if(y < minY){ ty = minY; minY = y; y = ty; tx = minX; minX = x; x = tx; } else if(y == minY && x < minX){ tx = minX; minX = x; x = tx; } if(i!=0){ //作为原点的点不加入vector中 p.x = x; p.y = y; v.push_back(p); } } s.x = minX; s.y = minY; sort(v.begin(),v.end(),cmp); //对夹角进行排序 stack<point> sta; sta.push(s); sta.push(v[0]); sta.push(v[1]); point p0,p1; double t; for(int i = 2;i<v.size();++i){ p1 = sta.top(); sta.pop(); //这里STL很不好用啊,不能直接访问栈里的元素 p0 = sta.top(); sta.push(p1); t = cross_mul_1(p0,p1,v[i]); if(t == 0){ continue; //跳过在同一直线上较近的点 } while(t < 0){ sta.pop(); p1 = sta.top(); sta.pop(); p0 = sta.top(); sta.push(p1); t = cross_mul_1(p0,p1,v[i]); } sta.push(v[i]); } p0 = s; printf("( %f , %f )\n",s.x,s.y); double sum = 0; while(!sta.empty()){ p1 = sta.top(); printf("( %f , %f )\n",p1.x,p1.y); sum += pow(pow(p1.x - p0.x,2.0)+pow(p1.y-p0.y,2.0),0.5); p0 = p1; sta.pop(); } cout.precision(2); cout<<fixed<<sum<<endl;}int main(){ graham();}
阅读全文
0 0
- Graham算法的实现
- 凸包问题的Graham扫描算法实现
- 浅析 Graham's Scan 算法的水平序实现
- 凸包Graham Scan算法实现
- 凸包Graham Scan算法实现
- 凸包Graham Scan算法实现
- Haskell lesson:实现Graham扫描算法
- Haskell基础课:实现Graham扫描算法
- 寻找凸包的Graham算法
- poj3348(求凸包的面积)graham算法。
- 凸包算法(Graham算法)实现,带图形
- Graham扫描算法(Graham Scan Algorithm)
- Graham(GiftWraping)求凸包算法
- graham求凸包算法
- 凸包 graham 算法
- 凸包 graham 算法
- 凸包 graham 算法
- Graham扫描法求点集凸包的原理及代码实现
- struts2文件上传的编写
- MV*模式
- Spark性能调优——其他调优方法
- day02-语言基础(1)
- 【洛谷1073】【NOIP2009t3】最优贸易
- Graham算法的实现
- Work4
- LeetCode-002 Add Two Numbers
- kotlin学习day8:表达式和ranges
- Gradle学习系列之七——依赖管理
- 连载:1.软考之目的
- ucos-iii学习之单任务应用程序
- MySQL(3)常见使用命令:数据表及表结构
- jpgraph 在linux上遇到的错误