栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

zoj 3495 Lego Bricks

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

zoj 3495 Lego Bricks

#include<iostream>#include<cstdio>#include<cstring>#include<cmath>using namespace std;int t, n, m;#define eps 1e-9#define SIZE 102struct pint{ pint(double x, double y):x(x), y(y){} pint(){} double x,y;};struct Cir{pint c; double r;} cir[SIZE];struct Line{pint a, b;} line[SIZE];double xmult(pint p1,pint p2,pint p0){return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);}double direction(pint p1, pint p2, pint p3){ return (p3.x - p1.x) * (p2.y - p1.y) - (p2.x - p1.x) * (p3.y - p1.y);}double dist(pint p1,pint p2){return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));}double disptoline(pint p,pint l1,pint l2){return fabs(xmult(p,l1,l2))/dist(l1,l2);}int intersect_seg_circle(pint c,double r,pint l1,pint l2){double t1=dist(c,l1)-r,t2=dist(c,l2)-r;pint t=c;if (t1<eps||t2<eps)return true;t.x+=l1.y-l2.y;t.y+=l2.x-l1.x;return xmult(l1,c,t)*xmult(l2,c,t)<eps&&disptoline(c,l1,l2)-r<eps;}int myeps(double xx){ if (fabs(xx) <= eps) return 0; else if (xx > 0) return 1; else return -1;}bool online(pint p1, pint p2, pint p3){ return (p3.x >= min(p1.x, p2.x) && p3.x <= max(p1.x, p2.x) && p3.y >= min(p1.y, p2.y) && p3.y <= max(p1.y, p2.y));}bool insect(pint p1, pint p2, pint p3, pint p4){ double d1 = xmult(p1, p4, p3); double d2 = xmult(p2, p4, p3); double d3 = xmult(p3, p2, p1); double d4 = xmult(p4, p2, p1); if (myeps (d1) * myeps (d2) < 0 && myeps (d3) * myeps (d4) < 0) return true; else if (myeps (d1) == 0 && online(p3, p4, p1)) return true; else if (myeps (d2) == 0 && online(p3, p4, p2)) return true; else if (myeps (d3) == 0 && online(p1, p2, p3)) return true; else if (myeps (d4) == 0 && online(p1, p2, p4)) return true; return false;}int que[SIZE], vst[SIZE];int main(){ scanf("%d", &t); while(t--) { scanf("%d%d", &n, &m); for(int i = 0; i < n; i++) { int a, b, c;scanf("%d%d%d", &a, &b, &c); cir[i].c = pint(a, b); cir[i].r = c; } for(int i = 0; i < m; i++) scanf("%lf%lf%lf%lf", &line[i].a.x, &line[i].a.y, &line[i].b.x, &line[i].b.y); int head = 0, tail = 0; memset(vst, 0, sizeof(vst)); bool flag = true; while(flag) { flag = false; for(int i = 0; i < m; i++) if (!vst[i]) { bool l = false, r = false; pint mid = pint((line[i].a.x + line[i].b.x) * 0.5, (line[i].a.y + line[i].b.y) * 0.5); for(int j = 0; j < n; j++) { if (intersect_seg_circle(cir[j].c, cir[j].r, line[i].a, mid))l = true; if (intersect_seg_circle(cir[j].c, cir[j].r, line[i].b, mid))r = true; } for(int j = 0; j < tail; j++) { if (insect(line[i].a, mid, line[que[j]].a, line[que[j]].b)) l = true; if (insect(line[i].b, mid, line[que[j]].a, line[que[j]].b)) r = true; } if (l && r) que[tail++] = i,vst[i] = true,flag = true; } } if (tail == m) printf("YESn"); else printf("NOn"); } return 0;}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/370981.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号