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多边形相交)
题意:给你一些多边形的点,判断每个多边形和那些多边形相交,编号按照字典序输出 思路:枚举每个多边形的每条边看是否相交,这里的相交是包括端点的,关键是给你正方形不相邻两个点求另外两个点怎么求,长方形给你 ...
随机推荐
- git clean -fdx
http://stackoverflow.com/questions/5807137/git-how-to-revert-uncommitted-changes-including-files-and ...
- usb-to-isp-for-stm32
- 使用内链接(A a inner join B b on a.xx = b.xx)查询2个表中某一列的相同的字段。
这里一句代码就是查询2个表中某一列的相同,可是查询出来之后B表因为有很多重复的id数据,然而查询出来的数据需要插入到临时表中,临时表的oid是不允许有重复的, 因此需要用到 distinct 函数来取 ...
- LightOJ 1370 Bi-shoe and Phi-shoe 数论
题目大意:f(x)=n 代表1-x中与x互质的数字的个数.给出n个数字a[i],要求f(x)=a[i],求x的和. 思路:每个素数x 有x-1个不大于x的互质数.则f(x)=a[i],若a[i]+1为 ...
- HDU1258 Sum it up
Sum it up 题意:给定一个数sum,和n个数,求sum可以由这n个数里面的那几个数的和表示. Given a specified total t and a list of n integer ...
- Android简单逐帧动画Frame的实现(二)
Android简单逐帧动画Frame的实现 Android简单逐帧动画Frame的实现 1.逐帧动画 即是通过播放预先排序好的图片来实现动态的画面,感觉像是放电影. 2.实现步骤: 1. 在工程里 ...
- Android自定义XML属性
<?xml version="1.0" encoding="utf-8"?> <resources> <declare-style ...
- Break on _NSLockError() to debug.
*** -[NSCondition dealloc]: condition (<NSCondition: 0x1039a450> '(null)') deallocated while s ...
- 11--tag 和transform属性
tag 和transform属性 1.tag 标签,就相当于身份识别的标码,可以通过tag值获取对应的对象. 2.使用transform 实现对象的平移和旋转. // // ViewControlle ...
- 什么是Jsp
1.什么是jsp java server page(java 服务器端页面技术),是 sun 公司制订的一种服务器端动态页面生成技术的规范. 因为直接使用 servlet 生成页面,如果页面比较复杂, ...