POJ 3449 Geometric Shapes
判断两个多边形是否相交,只需判断边是否有相交。
编码量有点大,不过思路挺简单的。
#include<cstdio> #include<cstring> #include<vector> #include<cmath> #include<string> #include<queue> #include<list> #include<algorithm> #include<iostream> using namespace std;string s; struct point {double x;double y;point (double a,double b){x=a;y=b;} };struct Sharp {string name;vector<point>v;vector<string> ans; }sharp[100]; int tot;bool cmp(const Sharp&a,const Sharp&b) {return a.name<b.name; }void work() {int a,b,c,d,e,f;if(s=="square"){scanf(" (%d,%d)",&a,&b);scanf(" (%d,%d)",&c,&d);point p1(1.0*a,1.0*b);point p2(1.0*(a+b+c-d)/2.0,1.0*(-a+b+c+d)/2.0);point p3(1.0*c,1.0*d);point p4(1.0*(a-b+c+d)/2.0,1.0*(a+b-c+d)/2.0);sharp[tot].v.push_back(p1);sharp[tot].v.push_back(p2);sharp[tot].v.push_back(p3);sharp[tot].v.push_back(p4);}if(s=="rectangle"){scanf(" (%d,%d)",&a,&b);scanf(" (%d,%d)",&c,&d);scanf(" (%d,%d)",&e,&f);point p1(1.0*a,1.0*b);point p2(1.0*c,1.0*d);point p3(1.0*e,1.0*f);point p4(p1.x+p3.x-p2.x,p1.y+p3.y-p2.y);sharp[tot].v.push_back(p1);sharp[tot].v.push_back(p2);sharp[tot].v.push_back(p3);sharp[tot].v.push_back(p4);}if(s=="line"){for(int i=1;i<=2;i++){scanf(" (%d,%d)",&a,&b);point p(1.0*a,1.0*b);sharp[tot].v.push_back(p);}}if(s=="triangle"){for(int i=1;i<=3;i++){scanf(" (%d,%d)",&a,&b);point p(1.0*a,1.0*b);sharp[tot].v.push_back(p);}}if(s=="polygon"){int x;scanf("%d",&x);for(int i=1;i<=x;i++){scanf(" (%d,%d)",&a,&b);point p(1.0*a,1.0*b);sharp[tot].v.push_back(p);}}tot++; }const double eps=1e-8; #define zero(x)(((x)>0?(x):(-x))<eps)double xmult(point p1,point p2,point p0) {return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y); }int dots_inline(point p1,point p2,point p3) {return zero(xmult(p1,p2,p3)); }int same_side(point p1,point p2,point l1,point l2) {return xmult(l1,p1,l2)*xmult(l1,p2,l2)>eps; }int dot_online_in(point p,point l1,point l2) {return zero(xmult(p,l1,l2))&&(l1.x-p.x)*(l2.x-p.x)<eps&&(l1.y-p.y)*(l2.y-p.y)<eps; }int intersect_in(point u1,point u2,point v1,point v2) {if(!dots_inline(u1,u2,v1)||!dots_inline(u1,u2,v2)) return !same_side(u1,u2,v1,v2)&&!same_side(v1,v2,u1,u2);return dot_online_in(u1,v1,v2)||dot_online_in(u2,v1,v2)||dot_online_in(v1,u1,u2)||dot_online_in(v2,u1,u2); }bool judge(int a,int b) {for(int i=0;i<sharp[a].v.size();i++){for(int j=0;j<sharp[b].v.size();j++){point p1=sharp[a].v[i];point p2=sharp[a].v[(i+1)%sharp[a].v.size()];point p3=sharp[b].v[j];point p4=sharp[b].v[(j+1)%sharp[b].v.size()];if(intersect_in(p1,p2,p3,p4)) return 1;}}return 0; }void init() {tot=0;for(int i=0;i<100;i++){sharp[i].ans.clear();sharp[i].v.clear();} } int main() {while(1){cin>>s;if(s==".") break;init();sharp[tot].name=s;cin>>s; work();while(1){cin>>s;if(s=="-") break;sharp[tot].name=s;cin>>s; work();}sort(sharp,sharp+tot,cmp);for(int i=0;i<tot;i++){for(int j=i+1;j<tot;j++){if(judge(i,j)){sharp[i].ans.push_back(sharp[j].name);sharp[j].ans.push_back(sharp[i].name);}}}for(int i=0;i<tot;i++){cout<<sharp[i].name<<" ";if(sharp[i].ans.size()==0) printf("has no intersections\n");else if(sharp[i].ans.size()==1) cout<<"intersects with "<<sharp[i].ans[0]<<endl;else if(sharp[i].ans.size()==2) cout<<"intersects with "<<sharp[i].ans[0]<<" and "<<sharp[i].ans[1]<<endl;else{printf("intersects with");for(int k=0;k<sharp[i].ans.size();k++){if(k<sharp[i].ans.size()-1) cout<<" "<<sharp[i].ans[k]<<",";else cout<<" and "<<sharp[i].ans[k]<<endl;}}}printf("\n");}return 0; }
转载于:https://www.cnblogs.com/zufezzt/p/5155080.html
POJ 3449 Geometric Shapes相关推荐
- Geometric Shapes - POJ 3449(多边形相交)
题目大意:给一些几何图形的编号,求出来这些图形都和那些相交. 分析:输入的正方形对角线上的两个点,所以需要求出来另外两个点,公式是: x2:=(x1+x3+y3-y1)/2; y2:=(y1+y3 ...
- Doing Math with Python读书笔记-第6章:Drawing Geometric Shapes and Fractals
本章学习利用matplotlib画几何图形和分形(fractal) 使用MATPLOTLIB库PATCHES包画几何图形 回顾之前的画图: plt.plot(...) plt.show() 也可以拆解 ...
- POJ 计算几何入门题目推荐
其实也谈不上推荐,只是自己做过的题目而已,甚至有的题目尚未AC,让在挣扎中.之所以推荐计算几何题,是因为,本人感觉ACM各种算法中计算几何算是比较实际的算法,在很多领域有着重要的用途(例如本人的专 ...
- [Z]POJ 计算几何入门题目推荐[转PKKJ]
http://www.cnblogs.com/eric-blog/archive/2011/05/31/2064785.html http://hi.baidu.com/novosbirsk/blog ...
- poj计算几何题推荐
POJ 计算几何入门题目推荐(转) 其实也谈不上推荐,只是自己做过的题目而已,甚至有的题目尚未AC,让在挣扎中.之所以推荐计算几何题,是因为,本人感觉ACM各种算法中计算几何算是比较实际的 ...
- poj 计算几何 分类
转自novosbirsk的空间,上面还有很多有用的东西. 计算几何题的特点与做题要领: 1.大部分不会很难,少部分题目思路很巧妙 2.做计算几何题目,模板很重要,模板必须高度可靠. 3.要注意代码的组 ...
- POJ 计算几何入门题目推荐(转)
POJ 计算几何入门题目推荐(转) 其实也谈不上推荐,只是自己做过的题目而已,甚至有的题目尚未AC,让在挣扎中.之所以推荐计算几何题,是因为,本人感觉ACM各种算法中计算几何算是比较实际的 ...
- kuangbin带你飞专题合集
题目列表 [kuangbin带你飞]专题一 简单搜索 [kuangbin带你飞]专题二 搜索进阶 [kuangbin带你飞]专题三 Dancing Links [kuangbin带你飞]专题四 最短路 ...
- ACM计算几何题目推荐
//第一期 计算几何题的特点与做题要领: 1.大部分不会很难,少部分题目思路很巧妙 2.做计算几何题目,模板很重要,模板必须高度可靠. 3.要注意代码的组织,因为计算几何的题目很容易上两百行代码,里面 ...
最新文章
- 获取线程结束代码(Exit Code)
- (转)HBase二级索引与Join
- 微信公众号接入图灵机器人实现自动回复消息
- python可变长参数(非关键字及关键字参数)
- 修改输入框placeholder的默认样式
- Python 模块EasyGui
- 内存泄漏(Memory Leak)
- Java程序员面试宝典--面向对象的基本概念
- markdown编辑器------------编辑方法
- java实例化对象的四种方式
- 正则表达式语法和常用表达式列表
- 精准测试白皮书2020版
- Firemonkey下使用StyleBook的一些经验
- 关于记忆的10个惊人事实
- cl.exe link.exe 用法
- ndows phone,Windows Phone 7
- 《Maven实战》(许晓斌)导读(读书笔记第二次读后感)
- HTML5 codecademy
- 大一新生HTML期末作业 个人网页王嘉尔明星介绍网页设计与制作
- 【产品分析】共享充电宝
热门文章
- LeetCode1117. Building H2O --Java解法--多线程保证执行顺序--AtomicInteger
- 1480. 一维数组的动态和
- oracle如何给表上锁,【ORACLE】Oracle中发生表加锁、死锁的原因,查看,与解决方法...
- Logstash(三)filter插件简介
- css中“[]”、“”“~”、“,”、“+”和“”详解
- gis许可服务器状态,把ArcGIS的许可指到本机(服务设为@l者机器名)通过修改注册表实现...
- java 拆分类_拆分或不拆分类(用Java)
- 安全策略_实操教程丨使用Pod安全策略强化K8S安全
- 序列每天从1开始_时间序列预测一
- 归纳推理测试没做完_敷完面膜不要做4件事,不但敷了面膜没效果,皮肤还变差了...