POJ 计算几何专项训练(2) 【1269】【1410】【1696】【3347】【2826】
POJ 1269 Intersecting Lines
题意很简单、判断两条直线是重合平行还是相交、如果相交输出交点、
Code:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>#define EPS 1e-9
#define INF 1e10using namespace std;int vv;
double x1,x2,x3,x4,yy1,y2,y3,y4;bool eq(double x1,double x2){return abs(x1-x2)<EPS;
}double slope(double x1,double y1,double x2,double y2){if (eq(x1,x2)) return INF;return (y2-y1)/(x2-x1);
}int main(){printf("INTERSECTING LINES OUTPUT\n");scanf("%d",&vv);while (vv--){scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&x1,&yy1,&x2,&y2,&x3,&y3,&x4,&y4);double k1=slope(x1,yy1,x2,y2),k2=slope(x3,y3,x4,y4);if (eq(k1,k2))if ((eq(x1,x2) && eq(x1,x3)) || (eq(yy1-k1*x1,y3-k2*x3)))printf("LINE\n");else printf("NONE\n");else{double b1=yy1-x1*k1,b2=y3-k2*x3;printf("POINT %.2lf %.2lf\n",(b2-b1)/(k1-k2),k1*(b2-b1)/(k1-k2)+b1);} }printf("END OF OUTPUT\n");return 0;
}
POJ 1410 Intersection
判断一条直线和一个矩形是否有公共部分(包含也算)、
Code:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>#define EPS 1e-9
#define INF 1e10using namespace std;struct segment{double beginx,beginy,endx,endy;
};double crossp(double x1,double y1,double x2,double y2){return x1*y2-x2*y1;
}int cross(segment a,segment b){if (min(a.beginx,a.endx)>max(b.beginx,b.endx) ||\min(b.beginx,b.endx)>max(a.beginx,a.endx) ||\min(a.beginy,a.endy)>max(b.beginy,b.endy) ||\min(b.beginy,b.endy)>max(a.beginy,a.endy)) return 0;if (crossp(a.beginx-b.beginx,a.beginy-b.beginy,b.endx-b.beginx,b.endy-b.beginy)\*crossp(b.endx-b.beginx,b.endy-b.beginy,a.endx-b.beginx,a.endy-b.beginy)>=0 &&\crossp(b.beginx-a.beginx,b.beginy-a.beginy,a.endx-a.beginx,a.endy-a.beginy)\*crossp(a.endx-a.beginx,a.endy-a.beginy,b.endx-a.beginx,b.endy-a.beginy)>=00) return 1;return 0;
}int vv;
segment temp,p;
double lx,rx,ty,by;int main(){scanf("%d",&vv);while (vv--){scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&temp.beginx,&temp.beginy,&temp.endx,&temp.endy,&lx,&ty,&rx,&by);if (lx>rx) swap(lx,rx);if (by>ty) swap(by,ty);if (temp.beginx>=lx && temp.beginx<=rx && temp.beginy>=by && temp.beginy<=ty &&\temp.endx>=lx && temp.endx<=rx && temp.endy>=by && temp.endy<=ty){cout <<'T' <<endl;continue;}p.beginx=p.endx=lx;p.beginy=by;p.endy=ty;if (cross(temp,p)){cout <<'T' <<endl;continue;}p.beginx=p.endx=rx;if (cross(temp,p)){cout <<'T' <<endl;continue;}p.beginx=lx;p.endx=rx;p.beginy=p.endy=by;if (cross(temp,p)){cout <<'T' <<endl;continue;}p.beginy=p.endy=ty;if (cross(temp,p)){cout <<'T' <<endl;continue;}else cout <<'F' <<endl;}return 0;
}
POJ 1696 Space Ant
卷包裹的概念题、
Code:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>#define INF 1e9using namespace std;struct point{int x,y;
};inline int distsquare(point A,point B){return (B.x-A.x)*(B.x-A.x)+(B.y-A.y)*(B.y-A.y);}
inline int det(int x1,int y1,int x2,int y2){return x1*y2-x2*y1;}
inline int cross(point A,point B,point C,point D){return det(B.x-A.x , B.y-A.y , D.x-C.x , D.y-C.y);}int vv,n;int main(){scanf("%d",&vv);while(vv--){scanf("%d",&n);point* node=new point[n+1];int* conbag=new int[n+1];bool* vist=new bool[n+1];int min_y=INF,fi=0;for(int i=1;i<=n;i++){int num;cin>>num>>node[i].x>>node[i].y;vist[i]=false;if(min_y > node[i].y){min_y = node[i].y;fi=i;}}conbag[1]=fi;conbag[0]=1;vist[fi]=true;int pc=1; while(1){int s=conbag[pc]; int k; for(int i=1;i<=n;i++) if(!vist[i]){k=i;break;}for(int i=1;i<=n;i++)if(i!=k && !vist[i]){int temp=cross(node[s],node[k],node[s],node[i]);if(temp<0) k=i;elseif(temp==0)if(distsquare(node[s],node[k]) > distsquare(node[s],node[i])) k=i;}conbag[++pc]=k;conbag[0]++;vist[k]=true;if(n-conbag[0]==1) break;}printf("%d ",conbag[0]+1);fi=0;for(int i=1;i<=conbag[0];i++){printf("%d ",conbag[i]);if(!vist[i]) fi=i;}if (fi) cout<<fi<<endl;else cout<<n<<endl;delete node;delete conbag;delete vist;}return 0;
}
POJ 3347 Kadj Squares
这个题目很有意思、、
首先,因为无论怎么扩大或者缩小边长,只要是同时对所有图形处理,都不会有问题、于是小数问题被解决了、
其次、对于每个正方形,如果它比前面一个小,显然放在那个的“下面”,否则,情况就比较复杂、于是我为乐简化讨论、对前面所有正方形求一下它能摆的最左位置,然后找出其中的最大值、
最后刷一个高度数组来判断可见、
Code:
#include <cstring>
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>#define sign printf("*\n")using namespace std;int h[5001],v[5001],len[5001],p[5001],fr[5001];
int n;int main(){scanf("%d",&n);while (n){memset(fr,0,sizeof fr);for (int i=1;i<=n;i++){scanf("%d",&len[i]);len[i]*=4;}p[1]=0;for (int i=2;i<=n;i++)if (len[i]<len[i-1]) p[i]=p[i-1]+len[i-1]+len[i];else{int cur=0;for (int j=1;j<i;j++)if (len[j]>len[i]) cur=max(cur,p[j]+len[j]+len[i]);else cur=max(cur,p[j]+len[j]*3-len[i]);p[i]=cur;}//sign;memset(h,0,sizeof h);for (int i=1;i<=n;i++){int cur=len[i];for (int j=0;j<len[i];j++){if (cur>h[p[i]+j]){h[p[i]+j]=cur;fr[p[i]+j]=i;}cur++;}if (cur>h[p[i]+len[i]]){h[p[i]+len[i]]=cur;fr[p[i]+len[i]]=i;}for (int j=len[i]+1;j<=len[i]*2;j++){cur--;if (cur>h[p[i]+j]){h[p[i]+j]=cur;fr[p[i]+j]=i;}}}//for (int i=1;i<=n;i++) printf("%d %d\n",i,p[i]);memset(v,0,sizeof v);for (int i=0;i<=5000;i++)v[fr[i]]++;int c=0;for (int i=1;i<=n;i++)if (v[i]){if (!c) c++;else printf(" ");printf("%d",i);}printf("\n");scanf("%d",&n);}
}
POJ 2826 An Easy Problem?!
太恶心了!、
题意很好理解,然后有以下几种特殊情况:
有水平线;
开口不是朝上的;
两条线段没有交点;
两条线段重合、
以上判断方法都不难、都考虑到就可以了、
(本题实际上是不卡精度的、列方程求解也可过、
Code:
#include <cstring>
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>#define EPS 1e-20
#define sqr(x) ((x)*(x))
#define INF 1e9
#define sign printf("*\n")using namespace std;struct segment{double sx,sy,ex,ey;
};segment s1,s2;int eq(double xx,double yy){return abs(xx-yy)<EPS;
}double dis(double x1,double y1,double x2,double y2){return sqrt(sqr(x1-x2)+sqr(y1-y2));
}double crossp(double x1,double y1,double x2,double y2){return x1*y2-x2*y1;
}double slope(double x1,double y1,double x2,double y2){return (eq(x1,x2)?INF:(y2-y1)/(x2-x1));
}int cross(segment a,segment b){if (max(a.sx,a.ex)<min(b.sx,b.ex) || max(a.sy,a.ey)<min(b.sy,b.ey) \|| min(a.sx,a.ex)>max(b.sx,b.ex) || min(a.sy,a.ey)>max(b.sy,b.ey)) return 0;if (crossp(a.sx-b.sx,a.sy-b.sy,b.ex-b.sx,b.ey-b.sy)*crossp(b.ex-b.sx,b.ey-b.sy,a.ex-b.sx,a.ey-b.sy)>=0 && \crossp(b.sx-a.sx,b.sy-a.sy,a.ex-a.sx,a.ey-a.sy)*crossp(a.ex-a.sx,a.ey-a.sy,b.ex-a.sx,b.ey-a.sy)>=0) return 1;else return 0;
}int main(){int vv;scanf("%d",&vv);while (vv--){scanf("%lf%lf%lf%lf",&s1.sx,&s1.sy,&s1.ex,&s1.ey);scanf("%lf%lf%lf%lf",&s2.sx,&s2.sy,&s2.ex,&s2.ey);if (s1.sy>s1.ey){swap(s1.sx,s1.ex);swap(s1.sy,s1.ey);}if (s2.sy>s2.ey){swap(s2.sx,s2.ex);swap(s2.sy,s2.ey);}if (!cross(s1,s2)){printf("0.00\n");continue;}if (eq(s1.sy,s1.ey) || eq(s2.sy,s2.ey)){printf("0.00\n");continue;}double k1=slope(s1.sx,s1.sy,s1.ex,s1.ey);double k2=slope(s2.sx,s2.sy,s2.ex,s2.ey);if (eq(k1,k2)){printf("0.00\n");continue;}double b1=s1.sy-k1*s1.sx;double b2=s2.sy-k2*s2.sx;double meetx=(b2-b1)/(k1-k2);double meety=meetx*k1+b1;double h=min(s1.ey,s2.ey);double d=abs((h-b1)/k1-(h-b2)/k2);//printf("%.2lf %.2lf %.2lf %.2lf %.2lf %.2lf %.2lf %.2lf\n",k1,b1,k2,b2,meetx,meety,h,d);if (k1*k2>0)if (abs(k1)>abs(k2)){if (abs(s1.ex-meetx)>=abs(s2.ex-meetx)){printf("0.00\n");continue;}}elseif (abs(s1.ex-meetx)<=abs(s2.ex-meetx)){printf("0.00\n");continue;}printf("%.2lf\n",0.5*d*(h-meety)+EPS);}
}
转载于:https://www.cnblogs.com/JS-Shining/archive/2013/01/18/2866951.html
POJ 计算几何专项训练(2) 【1269】【1410】【1696】【3347】【2826】相关推荐
- POJ 计算几何专项训练(1) 【2318】【2398】【3304】【2653】【1556】【1066】...
POJ 2318 TOYS 题意是在一个大矩形里有n条分割线把矩形分割成n+1部分.再给出一些玩具的坐标.要求统计每个部分内有多少个玩具. 具体做法就是二分求解出当前玩具右方的第一条线.这可以用叉积判 ...
- poj计算几何题推荐
POJ 计算几何入门题目推荐(转) 其实也谈不上推荐,只是自己做过的题目而已,甚至有的题目尚未AC,让在挣扎中.之所以推荐计算几何题,是因为,本人感觉ACM各种算法中计算几何算是比较实际的 ...
- POJ 计算几何入门题目推荐(转)
POJ 计算几何入门题目推荐(转) 其实也谈不上推荐,只是自己做过的题目而已,甚至有的题目尚未AC,让在挣扎中.之所以推荐计算几何题,是因为,本人感觉ACM各种算法中计算几何算是比较实际的 ...
- 以mips为单位衡量微型计算机的性能,2016计算机二级《MS Office》选择题专项训练...
2016计算机二级<MS Office>选择题专项训练 1.汉字的区位码由一汉字的区号和位号组成.其区号和位号的范围各为______. A.区号 1-95 位号 1-95 B.区号 1-9 ...
- 选择题微型计算机系统包括,全国计算机一级选择题专项训练及答案2016
全国计算机一级选择题专项训练及答案2016 练习题一 1.在微型计算机中,微处理器的主要功能是进行( D ) A.算术运算 B.逻辑运算 C.算术逻辑运算 D.算术逻辑运算及全机的控制 2.微型计算机 ...
- 计算机一级wps选择题必背知识点,计算机一级考试wps选择题专项训练
选择题是计算机一级考试的重要题型,为了帮助考生备考计算机一级考试的wps科目,下面学习啦小编为大家带来计算机一级考试wps选择题专项训练,欢迎考生备考练习. 计算机一级考试wps选择题专项训练1: 1 ...
- 一年级大括号问题专项训练_新人教版一年级数学上册5.9解决问题(减法)微课视频辅导|课后练习...
点击至乐人间 扫码关注我们 一道思维训练,一篇阅读技巧, 一份教育精华,一节同步课堂. 搭好童年基础桥梁,直击小学课堂要点! 我们共享教育资源! 特色: 1.1-9年阅读,作文,及相关技巧专项训练栏 ...
- 2022年驾驶员考试挖掘机司机多选题专项训练及答案
题库来源:优题宝公众号 2022年驾驶员考试挖掘机司机多选题专项训练及答案,由优题宝公众号根据最新驾驶员考试挖掘机司机大纲与历年驾驶员考试挖掘机司机真题汇总编写,包含驾驶员考试挖掘机司机常考重点题型与 ...
- 2022年执法资格通用法律知识考试判断题专项训练题及答案
题库来源:优题宝公众号 2022年执法资格通用法律知识考试判断题专项训练题及答案,由优题宝公众号根据最新执法资格通用法律知识考试大纲与历年执法资格通用法律知识考试真题汇总编写,包含执法资格通用法律知识 ...
- 2022年执法资格城管执法考试多选题专项训练题及答案
题库来源:优题宝公众号 2022年执法资格城管执法考试多选题专项训练题及答案,由优题宝公众号根据最新执法资格城管执法考试大纲与历年执法资格城管执法考试真题汇总编写,包含执法资格城管执法考试常考重点题型 ...
最新文章
- GitNote基于git的个人云笔记
- 史丹利对话中国农民丰收节交易会-万祥军:谋定跨国合作
- RxSwift之环境的搭建配置与基础控件的使用
- 2018蓝桥杯省赛---java---C---7(缩位求和)
- 两用物项许可证办理流程_办理医疗器械经营许可证流程
- oopc——8.经典案例1-rt thread
- C语言关键字浅析-_Bool
- msxml6_x64 下载
- 得空写的基于web的工作流表单设计器,大家看看怎么样
- 计算机语言收入排名,全球人均收入排名美元_计算机语言收入排名
- 集群技术走向成熟 核心路由器的趋势
- 2019.08.12【NOIP提高组】模拟 A 组
- pads 添加复用模块技巧、
- 广播发射系统的安装调试维护——TFN T300F天馈线驻波比测试仪手持矢量网络分析仪
- 76个常识,你知几个
- MySQL-SQL基础应用(SQL基础)
- Windows Server 2008 R2安装教程
- 程序员职业思考与规划 —— Java程序员年度总结:浅谈四点心得,也许路走得更远
- [MATLAB]基本操作与矩阵输入
- 客户懂点代码是最致命的毒药