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 ...
随机推荐
- js之json
关于json不了解的,请点击:http://www.json.org/json-zh.html json对象的属性必须要用双引号,值为字符串类型也只能使用双引号,例:{"name" ...
- spring、springmvc、mybatis整合笔记
这段时间上一个项目刚做完,下一个项目还没开始,趁这个时候来认真总结一下上个项目使用的ssm开发框架.由于,项目中关于使用ssm这部分的代码和配置是我们项目的整体架构师一个独立完成的,我们只负责业务部分 ...
- LeetCode Reverse Linked List II 反置链表2
题意:将指定的一段位置[m,n]的链表反置,返回链表头. 思路:主要麻烦在链表头,如果要从链表头就开始,比较特殊. 目前用DFS实现,先找到m-1的位置,再找到n+1的位置,中间这段就是否要反置的,交 ...
- LeetCode Count Primes 求素数个数(埃拉托色尼筛选法)
题意:给一个数n,返回小于n的素数个数. 思路:设数字 k =from 2 to sqrt(n),那么对于每个k,从k2开始,在[2,n)范围内只要是k的倍数的都删掉(也就是说[k,k2)是不用理的, ...
- 让ecshop编辑器功能更强大
ecshop后台的商品编辑和文章编辑使用的是FCKEDITOR 编辑器, 这个FCKEDITOR的工具条(toolbar)是可以自定义的,ECSHOP默认使用的是 normal ,属于中档功能, 下面 ...
- (三)spark集群DHCP IP变化后的处理
学校的网比较特殊(本人比较菜),需要DHCP获得地址,那么有时候IP被占用了,应该如何应对呢? 1)修改/etc/hosts 2) 修改spark-env.sh 里的 Master 地址 ,Maste ...
- HDU 5001 Walk
解题思路:这是一道简单的概率dp,只要处理好相关的细节就可以了. dp[d][i]表示走d步时走到i的改概率,具体参考代码: #include<cstdio> #include<cs ...
- 判断https
判断https <script> if(window.location.protocol=='https:'){ window.location.href='http://e.abchin ...
- android中的所谓观察者模式
生活中我们常认定某些人很有才,但什么是有才呢?明朝的王守仁曾这样解释:才,是所谓天理,应用到物上,便成了才.凡事凡物,只要掌握了所谓科学的方法,并能灵活运用,那么你也可以成为一个有才的人. 观察者模式 ...
- Android应用性能优化之使用SQLiteStatement优化SQLite操作
平常在做Android数据库操作时,都是用的execSQL之个方法. 今天偶然发现了SQLiteStatement这个类.让我想起了在做Java Web开发写JDBC的代码时Prestatement这 ...