POJ 3449 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
#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(判断几个不同图形的相交,线段相交判断)的更多相关文章
- POJ 3449 Geometric Shapes 判断多边形相交
题意不难理解,给出多个多边形,输出多边形间的相交情况(嵌套不算相交),思路也很容易想到.枚举每一个图形再枚举每一条边 恶心在输入输出,不过还好有sscanf(),不懂可以查看cplusplus网站 根 ...
- POJ 3449 Geometric Shapes (求正方形的另外两点)
Geometric Shapes Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 1470 Accepted: 622 D ...
- 简单几何(线段相交)+模拟 POJ 3449 Geometric Shapes
题目传送门 题意:给了若干个图形,问每个图形与哪些图形相交 分析:题目说白了就是处理出每个图形的线段,然后判断是否相交.但是读入输出巨恶心,就是个模拟题加上线段相交的判断,我第一次WA不知道输出要按字 ...
- POJ 3449 Geometric Shapes --计算几何,线段相交
题意: 给一些多边形或线段,输出与每一个多边形或线段的有哪一些多边形或线段. 解法: 想法不难,直接暴力将所有的图形处理成线段,然后暴力枚举,相交就加入其vector就行了.主要是代码有点麻烦,一步一 ...
- POJ 3449 Geometric Shapes
判断两个多边形是否相交,只需判断边是否有相交. 编码量有点大,不过思路挺简单的. #include<cstdio> #include<cstring> #include< ...
- 线段相交 poj 1066
// 线段相交 poj 1066 // 思路:直接枚举每个端点和终点连成线段,判断和剩下的线段相交个数 // #include <bits/stdc++.h> #include <i ...
- Geometric Shapes - POJ 3449(多边形相交)
题目大意:给一些几何图形的编号,求出来这些图形都和那些相交. 分析:输入的正方形对角线上的两个点,所以需要求出来另外两个点,公式是: x2:=(x1+x3+y3-y1)/2; y2:=(y1+y3 ...
- 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 ...
随机推荐
- HDU 1404 (博弈) Digital Deletions
首先如果第一个数字是0的话,那么先手必胜. 对于一个已知的先手必败状态,凡是能转移到先手必败的状态一定是必胜状态. 比如1是必败状态,那么2~9可以转移到1,所以是必胜状态. 10,10*,10**, ...
- POJ 1847 Tram【Floyd】
题意:给出n个站点,每个站点都有铁路通向其他站点 如果当前要走得路恰好是该站点的开关指向的铁路,则不用扳开关,否则要手动扳动开关,给出起点和终点,问最少需要扳动多少次开关 输入的第一行是n,start ...
- (转)每天一个Linux命令(5): rm
http://www.cnblogs.com/peida/archive/2012/10/26/2740521.html 昨天学习了创建文件和目录的命令mkdir ,今天学习一下linux中删除文件和 ...
- yii2.0 url 跳转
//转发 $this->render('page1',['id'=>3,'mark'=>2]); //显示page1页面 并传递 id mark 2个参数 //重定向 $thi ...
- OpenGL学习之路(四)
1 引子 上次读书笔记主要是学习了应用三维坐标变换矩阵对二维的图形进行变换,并附带介绍了GLSL语言的编译.链接相关的知识,之后介绍了GLSL中变量的修饰符,着重介绍了uniform修饰符,来向着色器 ...
- 嵌入式 H264—MP4格式及在MP4文件中提取H264的SPS、PPS及码流
一.MP4格式基本概念 MP4格式对应标准MPEG-4标准(ISO/IEC14496) 二.MP4封装格式核心概念 1 MP4封装格式对应标准为 ISO/IEC 14496-12(信息技术 视听对象 ...
- 自己的一个LESS工具函数库
自己大概在一年前开始使用LESS编写样式,现在感觉不用LESS都不会写样式了.现在写静态页面完全离不开LESS与Zen Coding,我可以不用什么IDE,但这两个工具却必须要,当然也强烈推荐看到这篇 ...
- DBus学习笔记
摘要:DBus作为一个轻量级的IPC被越来越多的平台接受,在MeeGo中DBus也是主要的进程间通信方式,这个笔记将从基本概念开始记录笔者学习DBus的过程 [1] DBus学习笔记一:DBus学习的 ...
- Free Candies
题意: 有4堆东西,每堆有n个每个有一个颜色,现在有一个篮子最多能装5个不同的颜色的东西,每次都从堆顶拿,当篮子出现两个相同颜色,可以获得这两个东西,求获得的最大数量 分析: 因为就4推,可以把各堆的 ...
- selenium python (十一)alert/confirm/prompt的处理(js中的弹出框)
webdriver中处理js所生成的alert.confirm以及prompt,采用switch_to_alert()方法定位到alert/confirm/prompt.然后使用text/accept ...