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多边形相交)
题意:给你一些多边形的点,判断每个多边形和那些多边形相交,编号按照字典序输出 思路:枚举每个多边形的每条边看是否相交,这里的相交是包括端点的,关键是给你正方形不相邻两个点求另外两个点怎么求,长方形给你 ...
随机推荐
- 更改 android realtek的系统权限
由于在 在删除系统的文件时候出现 Read-only file system,所以要获取权限. 推出shell adb mount mount -o rw,remount /system 就可以了
- C# 将字符串转为ऩ这种的 html实体编码
1.字符串转为html实体编码 private string GetHtmlEntities(string str) { string r = string.Empty; ; i < str.L ...
- servlet多次跳转报IllegalStateException异常
当发生在如下错误的时候,有一个方案可行, "java.lang.IllegalStateException: Cannot forward after response has been c ...
- linux命令-sed,uniq,cut,wc
sort sort 命令对 File 参数指定的文件中的行排序,并将结果写到标准输出.如果 File 参数指定多个文件,那么 sort 命令将这些文件连接起来,并当作一个文件进行排序. sort语法 ...
- java 反射的实例
JAVA反射机制是在运行状态中,对于任意一个类,都能够得到这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制 ...
- static方法与非static方法是否可以互相调用
情况一.static方法调用非static方法 非静态方法只有实例对象才可调用,而静态方法随着类的加载而加载,类的加载在实例对象产生之前,所以静态方法不能调用非静态方法 情况二.非atic方法调用st ...
- js 弹层 提示
<!DOCTYPE html><html style="height: 100%;"><head lang="en"> &l ...
- mysql 初始化时root无密码
修改密码 update user set password=PASSWORD('123456') where User='root'; 添加用户设置权限 grant select,insert,upd ...
- frame、bounds表示大小和位置的属性以及center、position、anchorPosition
在iOS开发开发过程中经常会用到界面元素的frame.bounds表示大小和位置的属性以及center.position.anchorPosition等单纯表示位置的属性.这些属性究竟什么含义?彼此间 ...
- U3D脚本开发基础
1.MonoBehaviour类,定义了对各种特定事件的脚本响应函数.这些函数均以On做开头. 2.U3D中常用的组件及对应变量名如下: Transform(transform),Rigidbody( ...