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[];
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=;i<=;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=;i<=;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=;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-;
#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=;i<sharp[a].v.size();i++)
{
for(int j=;j<sharp[b].v.size();j++)
{
point p1=sharp[a].v[i];
point p2=sharp[a].v[(i+)%sharp[a].v.size()];
point p3=sharp[b].v[j];
point p4=sharp[b].v[(j+)%sharp[b].v.size()]; if(intersect_in(p1,p2,p3,p4)) return ;
}
}
return ;
} void init()
{
tot=;
for(int i=;i<;i++)
{
sharp[i].ans.clear();
sharp[i].v.clear();
}
}
int main()
{
while()
{
cin>>s;
if(s==".") break; init(); sharp[tot].name=s;
cin>>s; work(); while()
{
cin>>s;
if(s=="-") break; sharp[tot].name=s;
cin>>s; work();
} sort(sharp,sharp+tot,cmp); for(int i=;i<tot;i++)
{
for(int j=i+;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=;i<tot;i++)
{
cout<<sharp[i].name<<" ";
if(sharp[i].ans.size()==) printf("has no intersections\n");
else if(sharp[i].ans.size()==) cout<<"intersects with "<<sharp[i].ans[]<<endl;
else if(sharp[i].ans.size()==) cout<<"intersects with "<<sharp[i].ans[]<<" and "<<sharp[i].ans[]<<endl;
else
{
printf("intersects with");
for(int k=;k<sharp[i].ans.size();k++)
{
if(k<sharp[i].ans.size()-) cout<<" "<<sharp[i].ans[k]<<",";
else cout<<" and "<<sharp[i].ans[k]<<endl;
}
}
}
printf("\n");
}
return ;
}
POJ 3449 Geometric Shapes的更多相关文章
- POJ 3449 Geometric Shapes(判断几个不同图形的相交,线段相交判断)
Geometric Shapes Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 1243 Accepted: 524 D ...
- POJ 3449 Geometric Shapes (求正方形的另外两点)
Geometric Shapes Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 1470 Accepted: 622 D ...
- POJ 3449 Geometric Shapes --计算几何,线段相交
题意: 给一些多边形或线段,输出与每一个多边形或线段的有哪一些多边形或线段. 解法: 想法不难,直接暴力将所有的图形处理成线段,然后暴力枚举,相交就加入其vector就行了.主要是代码有点麻烦,一步一 ...
- 简单几何(线段相交)+模拟 POJ 3449 Geometric Shapes
题目传送门 题意:给了若干个图形,问每个图形与哪些图形相交 分析:题目说白了就是处理出每个图形的线段,然后判断是否相交.但是读入输出巨恶心,就是个模拟题加上线段相交的判断,我第一次WA不知道输出要按字 ...
- POJ 3449 Geometric Shapes 判断多边形相交
题意不难理解,给出多个多边形,输出多边形间的相交情况(嵌套不算相交),思路也很容易想到.枚举每一个图形再枚举每一条边 恶心在输入输出,不过还好有sscanf(),不懂可以查看cplusplus网站 根 ...
- TZOJ 2560 Geometric Shapes(判断多边形是否相交)
描述 While creating a customer logo, ACM uses graphical utilities to draw a picture that can later be ...
- poj3449 Geometric Shapes【计算几何】
含[判断线段相交].[判断两点在线段两侧].[判断三点共线].[判断点在线段上]模板 Geometric Shapes Time Limit: 2000MS Memory Limit: 655 ...
- Geometric Shapes - POJ 3449(多边形相交)
题目大意:给一些几何图形的编号,求出来这些图形都和那些相交. 分析:输入的正方形对角线上的两个点,所以需要求出来另外两个点,公式是: x2:=(x1+x3+y3-y1)/2; y2:=(y1+y3 ...
- Geometric Shapes (poj3449多边形相交)
题意:给你一些多边形的点,判断每个多边形和那些多边形相交,编号按照字典序输出 思路:枚举每个多边形的每条边看是否相交,这里的相交是包括端点的,关键是给你正方形不相邻两个点求另外两个点怎么求,长方形给你 ...
随机推荐
- 第一次安装ubuntu要设置的东西
1. 安装网卡驱动 lscpi 查看网卡型号 根据型号找到驱动源码 下载下来并编译 安装 2. 编译安卓源码的时候出现jdk型号不对的情况 把/usr/bin/java 删除,就可以了.
- rebar
www.cnblogs.com/panfeng412/archive/2011/08/14/2137990.html
- Java学习笔记之I/O
package com.chinasofti.javase20160819; import java.io.BufferedReader; import java.io.BufferedWriter; ...
- 20160128_关于SVN提交不了并且还提示升级的解决方法
因为是在项目中新增了文件夹,可能是直接在文件夹里放入文件,导致svn没有读取到文件信息,所以提交不了. 搞了一晚上,蛋疼死,解决方法:把新增的文件夹复制出来,删掉里面的 .svn文件夹.然后删掉项目里 ...
- auto_ash
#!/usr/bin/ksh ##############paramter######################startdate=$1' 00:00:01'enddate=$2' 23:59: ...
- TextureView+SurfaceTexture+OpenGL ES来播放视频(一)
引自:http://www.ithao123.cn/content-8733143.html 最近发现视频直播类应用层出不穷,比如233手游直播,蓝鲸直播,微录客等等什么的,连android界大神老罗 ...
- Python定制类
https://docs.python.org/3/reference/datamodel.html#special-method-names
- VMI
在虚拟机外部监控虚拟机内部运行状态的方法被称为虚拟机自省(Virtual Machine Introspection,VMI).VMI允许特权域查看非特权域的运行状态,并能获得被监控虚拟机运行状况相关 ...
- AutoTile 自动拼接(六 大结局) 学习与实践
昨天在网上找了一些资源图片,这回就不用担心 背景资源不多的问题了,现在我一边 制作,一边发布文章. 各种各样,500多个,这里还是特别感谢 ,万恶的资本主义,不设密码就给我分享. 在制作前,大家看下这 ...
- thinkPHP16---伪静态
url伪静态通常是为了 满足更好的SEO效果,thinkPHP支持伪静态url设置,可以通过设置URL_HTML_SUFFIX的参数 随意在URL的最后添加你想要的静态后缀,而不会影响当前操作的正常执 ...