poj 3449 Geometric Shapes
来源:互联网 发布:网络平台维护费 编辑:程序博客网 时间:2024/06/05 09:35
求各种图形的相交问题,简化到求线段相交问题。
WA了一次,原因是叉积相乘超出了int范围,以后要注意!
#include<iostream>#include<cstring>#include<cstdio>#include<cmath>#include<algorithm>using namespace std;char str[30][3], ans[30];int n;struct Point{ int x, y; Point operator +(Point p1)const{ p1.x+=x;p1.y+=y; return p1; } Point operator -(Point p1)const{ p1.x=x-p1.x;p1.y=y-p1.y; return p1; }};struct Segline{Point s, e;};struct node{ char name; int cnt; Point p[25];}a[30];Point getpoint(){ char ss[20]; Point pt; scanf("%s", ss); sscanf(ss, "%*c%d%*c%d%*c", &pt.x, &pt.y); return pt;}void read(){ a[n].name=str[n][0]; char ss[20]; scanf("%s", ss); if(strcmp(ss, "square")==0){ a[n].cnt=4; a[n].p[0]=getpoint(); a[n].p[2]=getpoint(); a[n].p[1].x=(a[n].p[0].x+a[n].p[2].x+a[n].p[2].y-a[n].p[0].y)/2; a[n].p[1].y=(a[n].p[0].y+a[n].p[2].y+a[n].p[0].x-a[n].p[2].x)/2; a[n].p[3].x=(a[n].p[0].x+a[n].p[2].x-a[n].p[2].y+a[n].p[0].y)/2; a[n].p[3].y=(a[n].p[0].y+a[n].p[2].y-a[n].p[0].x+a[n].p[2].x)/2; } else if(strcmp(ss, "rectangle")==0){ a[n].cnt=4; a[n].p[0]=getpoint(); a[n].p[1]=getpoint(); a[n].p[2]=getpoint(); a[n].p[3]=a[n].p[0]+a[n].p[2]-a[n].p[1]; } else if(strcmp(ss, "line")==0){ a[n].cnt=2; a[n].p[0]=getpoint(); a[n].p[1]=getpoint(); } else if(strcmp(ss, "triangle")==0){ a[n].cnt=3; a[n].p[0]=getpoint(); a[n].p[1]=getpoint(); a[n].p[2]=getpoint(); } else if(strcmp(ss, "polygon")==0){ scanf("%d", &a[n].cnt); for(int i=0; i<a[n].cnt; i++) a[n].p[i]=getpoint(); }}void init(){ read(); n=1; while(scanf("%s", str[n])&&str[n][0]!='-'){ read(); n++; }}bool cmp(node a1, node a2){ return a1.name<a2.name;}long long x_mult(Point sp, Point ep, Point op){ return (long long)(sp.x-op.x)*(ep.y-op.y)-(long long)(sp.y-op.y)*(ep.x-op.x);}bool online(Point p1, Point p2, Point p3, Point p4){ if(max(p1.x,p2.x)<min(p3.x,p4.x)||max(p1.y,p2.y)<min(p3.y, p4.y)|| min(p1.x,p2.x)>max(p3.x,p4.x)||min(p1.y,p2.y)>max(p3.y, p4.y)) return false; return true;}bool x_segline(Segline s1, Segline s2){ if(online(s1.s,s1.e,s2.s,s2.e)&& x_mult(s1.e, s2.s, s1.s)*x_mult(s1.e, s2.e, s1.s)<=0&& x_mult(s2.e, s1.s, s2.s)*x_mult(s2.e, s1.e, s2.s)<=0) return true; return false;}bool check(node a1, node a2){ Segline seg1, seg2; a1.p[a1.cnt]=a1.p[0];a2.p[a2.cnt]=a2.p[0]; for(int i=0; i<a1.cnt; i++){ seg1.s=a1.p[i];seg1.e=a1.p[i+1]; for(int j=0; j<a2.cnt; j++){ seg2.s=a2.p[j];seg2.e=a2.p[j+1]; if(x_segline(seg1, seg2)) return true; } } return false;}void solve(){ sort(a, a+n, cmp); for(int i=0; i<n; i++){ int res=0; for(int j=0; j<n; j++){ if(j==i)continue; if(check(a[i], a[j])){ ans[res++]=a[j].name; } } if(res==0) printf("%c has no intersections\n", a[i].name); else if(res==1) printf("%c intersects with %c\n", a[i].name, ans[0]); else if(res==2) printf("%c intersects with %c and %c\n", a[i].name, ans[0], ans[1]); else { printf("%c intersects with ", a[i].name); for(int k=0; k<res-1; k++) printf("%c, ", ans[k]); printf("and %c\n", ans[res-1]); } } printf("\n");}int main(){ //freopen("1.txt", "r", stdin); n=0; while(scanf("%s", str[0])&&str[0][0]!='.'){ init(); solve(); n=0; } return 0;}
- poj 3449 Geometric Shapes
- poj 3449 Geometric Shapes
- POJ 3449 Geometric Shapes
- POJ 3449 Geometric Shapes
- Geometric Shapes - POJ 3449
- POJ 3449 Geometric Shapes
- zoj 2906 || poj 3449 Geometric Shapes
- POJ 3449 Geometric Shapes (线段相交)
- poj 3449 Geometric Shapes(计算几何)
- poj 3449 Geometric Shapes 线段相交
- POJ 3449 Geometric Shapes (多边形相交)
- poj 3449 Geometric Shapes 计算几何
- POJ 3449 Geometric Shapes(几何相交)
- poj 3449 Geometric Shapes(多边形相交判断)
- POJ 3449 Geometric Shapes 判断各种图形是否相交
- POJ 3449 Geometric Shapes(判断多边形相交情况)
- poj 3449 Geometric Shapes(判断多边形是否相交)
- POJ 3449 Geometric Shapes(判断几个不同图形的相交)
- 小宝,小宝,我爱你
- 经典面试题——求字符串中最长的数字串
- c语言 三大循环 四大跳转 和判断语句
- js控制文本框只能输入数字
- 计算机的哲学透视
- poj 3449 Geometric Shapes
- JPEG详细介绍
- oVirt: 基于 KVM 的虚拟机软件
- 擦除失败之后就能确认nandflash 的这个块是坏的吗?
- [转载]Objective-C中内存管理的规则
- android 单例模式!
- Windows平台下Android源码的下载
- Android获取已安装应用信息(图标,名称,版本号,包)
- SendMessage、PostMessage原理