Geometric Shapes
Time Limit: 2000MS   Memory Limit: 65536K
Total Submissions: 1243   Accepted: 524

Description

While creating a customer logo, ACM uses graphical utilities to draw a picture that can later be cut into special fluorescent materials. To ensure proper processing, the shapes in the picture cannot intersect. However, some logos contain such intersecting shapes. It is necessary to detect them and decide how to change the picture.

Given a set of geometric shapes, you are to determine all of their intersections. Only outlines are considered, if a shape is completely inside another one, it is not counted as an intersection.

Input

Input contains several pictures. Each picture describes at most 26 shapes, each specified on a separate line. The line begins with an uppercase letter that uniquely identifies the shape inside the corresponding picture. Then there is a kind of the shape and two or more points, everything separated by at least one space. Possible shape kinds are:

• square: Followed by two distinct points giving the opposite corners of the square.
• rectangle: Three points are given, there will always be a right angle between the lines connecting the first point with the second and the second with the third.
• line: Specifies a line segment, two distinct end points are given.
• triangle: Three points are given, they are guaranteed not to be co-linear.
• polygon: Followed by an integer number N (3 ≤ N ≤ 20) and N points specifying vertices of the polygon in either clockwise or anti-clockwise order. The polygon will never intersect itself and its sides will have non-zero length.

All points are always given as two integer coordinates X and Y separated with a comma and enclosed in parentheses. You may assume that |X|, |Y | ≤ 10000.

The picture description is terminated by a line containing a single dash (“-”). After the last picture, there is a line with one dot (“.”).

Output

For each picture, output one line for each of the shapes, sorted alphabetically by its identifier (X). The line must be one of the following:

• “X has no intersections”, if X does not intersect with any other shapes.
• “X intersects with A”, if X intersects with exactly 1 other shape.
• “X intersects with A and B”, if X intersects with exactly 2 other shapes.
• “X intersects with A, B, . . ., and Z”, if X intersects with more than 2 other shapes.

Please note that there is an additional comma for more than two intersections. A, B, etc. are all intersecting shapes, sorted alphabetically.

Print one empty line after each picture, including the last one.

Sample Input

A square (1,2) (3,2)
F line (1,3) (4,4)
W triangle (3,5) (5,5) (4,3)
X triangle (7,2) (7,4) (5,3)
S polygon 6 (9,3) (10,3) (10,4) (8,4) (8,1) (10,2)
B rectangle (3,3) (7,5) (8,3)
-
B square (1,1) (2,2)
A square (3,3) (4,4)
-
.

Sample Output

A has no intersections
B intersects with S, W, and X
F intersects with W
S intersects with B
W intersects with B and F
X intersects with B A has no intersections
B has no intersections

Source

 
 
 
 
题目首先要
根据正方形给出的两个对角线的顶点,求另外两个顶点。
正方形,已知 (x0,y0) 和(x2,y2)  可以根据下列关系求(x1,y1),(x3,y3)
 
x1+x3 = x0+x2;
x1-x3  =  y2-y0;
y1+y3 =  y0-y2;
y1-y3 =  x0-x2;
 
矩形类似。
 
然后判断线段相交即可。
 
 
注意输入输出格式控制。
 
 
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <queue>
#include <map>
#include <vector>
#include <set>
#include <string>
#include <math.h> using namespace std;
const double eps = 1e-;
int sgn(double x)
{
if(fabs(x) < eps)return ;
if(x < )return -;
else return ;
}
struct Point
{
double x,y;
Point(){}
Point(double _x,double _y)
{
x = _x;y = _y;
}
Point operator -(const Point &b)const
{
return Point(x - b.x,y - b.y);
}
//叉积
double operator ^(const Point &b)const
{
return x*b.y - y*b.x;
}
//点积
double operator *(const Point &b)const
{
return x*b.x + y*b.y;
}
};
struct Line
{
Point s,e;
Line(){}
Line(Point _s,Point _e)
{
s = _s;e = _e;
}
};
//*判断线段相交
bool inter(Line l1,Line l2)
{
return
max(l1.s.x,l1.e.x) >= min(l2.s.x,l2.e.x) &&
max(l2.s.x,l2.e.x) >= min(l1.s.x,l1.e.x) &&
max(l1.s.y,l1.e.y) >= min(l2.s.y,l2.e.y) &&
max(l2.s.y,l2.e.y) >= min(l1.s.y,l1.e.y) &&
sgn((l2.s-l1.e)^(l1.s-l1.e))*sgn((l2.e-l1.e)^(l1.s-l1.e)) <= &&
sgn((l1.s-l2.e)^(l2.s-l2.e))*sgn((l1.e-l2.e)^(l2.s-l2.e)) <= ;
} struct Node
{
char id;
int n;//点数
Point p[];
}node[];
bool cmp(Node a,Node b)
{
return a.id < b.id;
}
char str[];
bool check(Node a,Node b)
{
for(int i = ;i < a.n;i++)
for(int j = ;j < b.n;j++)
if(inter(Line(a.p[i],a.p[(i+)%a.n]),Line(b.p[j],b.p[(j+)%b.n])))
return true;
return false;
}
bool ff[];
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int n;
while(scanf("%s",str) == )
{
if(str[] == '.')break;
node[].id = str[];
scanf("%s",str);
if(strcmp(str,"square")==)
{
node[].n = ;
scanf(" (%lf,%lf)",&node[].p[].x,&node[].p[].y);
//cout<<node[0].p[0].x<<" "<<node[0].p[0].y<<endl;
scanf(" (%lf,%lf)",&node[].p[].x,&node[].p[].y);
// cout<<node[0].p[2].x<<" "<<node[0].p[2].y<<endl;
node[].p[].x = ((node[].p[].x+node[].p[].x)+(node[].p[].y-node[].p[].y))/;
node[].p[].y = ((node[].p[].y+node[].p[].y)+(node[].p[].x-node[].p[].x))/;
node[].p[].x = ((node[].p[].x+node[].p[].x)-(node[].p[].y-node[].p[].y))/;
node[].p[].y = ((node[].p[].y+node[].p[].y)-(node[].p[].x-node[].p[].x))/;
}
else if(strcmp(str,"line")==)
{
node[].n = ;
scanf(" (%lf,%lf)",&node[].p[].x,&node[].p[].y);
scanf(" (%lf,%lf)",&node[].p[].x,&node[].p[].y);
}
else if(strcmp(str,"triangle")==)
{
node[].n = ;
scanf(" (%lf,%lf)",&node[].p[].x,&node[].p[].y);
scanf(" (%lf,%lf)",&node[].p[].x,&node[].p[].y);
scanf(" (%lf,%lf)",&node[].p[].x,&node[].p[].y);
}
else if(strcmp(str,"rectangle")==)
{
node[].n = ;
scanf(" (%lf,%lf)",&node[].p[].x,&node[].p[].y);
scanf(" (%lf,%lf)",&node[].p[].x,&node[].p[].y);
scanf(" (%lf,%lf)",&node[].p[].x,&node[].p[].y);
node[].p[].x = node[].p[].x + (node[].p[].x - node[].p[].x);
node[].p[].y = node[].p[].y + (node[].p[].y - node[].p[].y);
}
else if(strcmp(str,"polygon")==)
{
scanf("%d",&node[].n);
for(int i = ;i < node[].n;i++)
{
scanf(" (%lf,%lf)",&node[].p[i].x,&node[].p[i].y);
}
}
n = ;
while(scanf("%s",str)==)
{ //cout<<str<<endl;
if(str[] == '-')break;
node[n].id = str[];
scanf("%s",str);
if(strcmp(str,"square")==)
{
node[n].n = ;
scanf(" (%lf,%lf)",&node[n].p[].x,&node[n].p[].y);
scanf(" (%lf,%lf)",&node[n].p[].x,&node[n].p[].y);
node[n].p[].x = ((node[n].p[].x+node[n].p[].x)+(node[n].p[].y-node[n].p[].y))/;
node[n].p[].y = ((node[n].p[].y+node[n].p[].y)+(node[n].p[].x-node[n].p[].x))/;
node[n].p[].x = ((node[n].p[].x+node[n].p[].x)-(node[n].p[].y-node[n].p[].y))/;
node[n].p[].y = ((node[n].p[].y+node[n].p[].y)-(node[n].p[].x-node[n].p[].x))/;
}
else if(strcmp(str,"line")==)
{
node[n].n = ;
scanf(" (%lf,%lf)",&node[n].p[].x,&node[n].p[].y);
scanf(" (%lf,%lf)",&node[n].p[].x,&node[n].p[].y);
}
else if(strcmp(str,"triangle")==)
{
node[n].n = ;
scanf(" (%lf,%lf)",&node[n].p[].x,&node[n].p[].y);
scanf(" (%lf,%lf)",&node[n].p[].x,&node[n].p[].y);
scanf(" (%lf,%lf)",&node[n].p[].x,&node[n].p[].y);
}
else if(strcmp(str,"rectangle")==)
{
node[n].n = ;
scanf(" (%lf,%lf)",&node[n].p[].x,&node[n].p[].y);
scanf(" (%lf,%lf)",&node[n].p[].x,&node[n].p[].y);
scanf(" (%lf,%lf)",&node[n].p[].x,&node[n].p[].y);
node[n].p[].x = node[n].p[].x + (node[n].p[].x - node[n].p[].x);
node[n].p[].y = node[n].p[].y + (node[n].p[].y - node[n].p[].y);
}
else if(strcmp(str,"polygon")==)
{
scanf("%d",&node[n].n);
for(int i = ;i < node[n].n;i++)
{
scanf(" (%lf,%lf)",&node[n].p[i].x,&node[n].p[i].y);
}
}
n++;
}
sort(node,node+n,cmp);
for(int i = ;i < n;i++)
{
printf("%c ",node[i].id);
memset(ff,false,sizeof(ff));
int cnt = ;
for(int j = ;j < n;j++)
if(i != j)
if(check(node[i],node[j]))
{
cnt++;
ff[j] = true;
}
if(cnt == )printf("has no intersections\n");
else if(cnt == )
{
printf("intersects with ");
for(int j = ; j < n;j++)
if(ff[j])
{
printf("%c\n",node[j].id);
break;
}
}
else if(cnt == )
{
printf("intersects with ");
for(int j = ; j < n;j++)
if(ff[j])
{
if(cnt==)printf("%c ",node[j].id);
if(cnt==)printf("and %c\n",node[j].id);
cnt--;
}
}
else
{
printf("intersects with ");
for(int j = ; j < n;j++)
if(ff[j])
{
if(cnt > )printf("%c, ",node[j].id);
if(cnt==)printf("and %c\n",node[j].id);
cnt--;
}
}
} printf("\n");
}
}
 
 
 
 
 

POJ 3449 Geometric Shapes(判断几个不同图形的相交,线段相交判断)的更多相关文章

  1. POJ 3449 Geometric Shapes 判断多边形相交

    题意不难理解,给出多个多边形,输出多边形间的相交情况(嵌套不算相交),思路也很容易想到.枚举每一个图形再枚举每一条边 恶心在输入输出,不过还好有sscanf(),不懂可以查看cplusplus网站 根 ...

  2. POJ 3449 Geometric Shapes (求正方形的另外两点)

    Geometric Shapes Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 1470   Accepted: 622 D ...

  3. 简单几何(线段相交)+模拟 POJ 3449 Geometric Shapes

    题目传送门 题意:给了若干个图形,问每个图形与哪些图形相交 分析:题目说白了就是处理出每个图形的线段,然后判断是否相交.但是读入输出巨恶心,就是个模拟题加上线段相交的判断,我第一次WA不知道输出要按字 ...

  4. POJ 3449 Geometric Shapes --计算几何,线段相交

    题意: 给一些多边形或线段,输出与每一个多边形或线段的有哪一些多边形或线段. 解法: 想法不难,直接暴力将所有的图形处理成线段,然后暴力枚举,相交就加入其vector就行了.主要是代码有点麻烦,一步一 ...

  5. POJ 3449 Geometric Shapes

    判断两个多边形是否相交,只需判断边是否有相交. 编码量有点大,不过思路挺简单的. #include<cstdio> #include<cstring> #include< ...

  6. 线段相交 poj 1066

    // 线段相交 poj 1066 // 思路:直接枚举每个端点和终点连成线段,判断和剩下的线段相交个数 // #include <bits/stdc++.h> #include <i ...

  7. Geometric Shapes - POJ 3449(多边形相交)

    题目大意:给一些几何图形的编号,求出来这些图形都和那些相交.   分析:输入的正方形对角线上的两个点,所以需要求出来另外两个点,公式是: x2:=(x1+x3+y3-y1)/2; y2:=(y1+y3 ...

  8. TZOJ 2560 Geometric Shapes(判断多边形是否相交)

    描述 While creating a customer logo, ACM uses graphical utilities to draw a picture that can later be ...

  9. poj3449 Geometric Shapes【计算几何】

    含[判断线段相交].[判断两点在线段两侧].[判断三点共线].[判断点在线段上]模板   Geometric Shapes Time Limit: 2000MS   Memory Limit: 655 ...

随机推荐

  1. CAS 在 Tomcat 中实现单点登录

    单点登录(Single Sign On , 简称 SSO )是目前比较流行的服务于企业业务整合的解决方案之一, SSO 使得在多个应用系统 中,用户只需要登录一次就可以访问所有相互信任的应用系统.CA ...

  2. 转:ORACLE的JDBC连接方式:OCI和THIN

    oracle的jdbc连接方式:oci和thin oci和thin是Oracle提供的两套Java访问Oracle数据库方式. thin是一种瘦客户端的连接方式,即采用这种连接方式不需要安装oracl ...

  3. HDU 3951 (博弈) Coin Game

    先考虑两种简单的情况: 如果先手能一次把硬币拿完,即 k >= n ,那么先手胜 如果每次只能拿一个硬币, 即 k = 1 ,那么如果有奇数个硬币先手胜,如果有偶数个硬币后手胜. 剩下的情况就是 ...

  4. HDU 2870 Largest Submatrix

    这三道题的关系是这样的,1505是1506的加强版,2870又是1505的加强版 如果按照上面由简到易的顺序来做的话,还是很简单的 这道题的思想就是 枚举+DP 因为某些字符可以变值,所以我们枚举a, ...

  5. 漫游Kafka设计篇之Producer和Consumer

    Kafka Producer 消息发送 producer直接将数据发送到broker的leader(主节点),不需要在多个节点进行分发.为了帮助producer做到这点,所有的Kafka节点都可以及时 ...

  6. list() and tuple()

    >>> l = list('sdfsdf') >>> l ['s', 'd', 'f', 's', 'd', 'f'] >>> t = tuple ...

  7. Android GLSurfaceView用法详解(二)

    输入如何处理       若是开发一个交互型的应用(如游戏),通常需要子类化 GLSurfaceView,由此可以获取输入事件.下面有个例子: java代码: package eoe.ClearTes ...

  8. DataTable添加列和行的三种方法

    JRoger 原文 #region 方法一: DataTable tblDatas =new DataTable("Datas"); DataColumn dc =null; dc ...

  9. hdu 4508 湫湫系列故事——减肥记I(完全背包)

    题意:完全背包 思路:完全背包 可以直接转化为 多重背包,num[i]=_v/c[i];//转为多重背包然后运用 多重背包 3种解法如下码1: #include<iostream> #in ...

  10. AngularJS自定义指令(Directives)在IE8下的一个坑

    在项目中,由于要兼容到IE8,我使用1.2.8版本的angularJS.这个版本是支持自定义指令的.我打算使用自定义指令将顶部的header从其他页面分离.也就是实现在需要header的页面只用在&l ...