POJ 1066 线段相交
来源:互联网 发布:软件需求工程师 编辑:程序博客网 时间:2024/05/16 12:11
题意
给定n面墙, 这n面墙可能相交, 给出一个点, 可以在墙(相交后)的中点开门, 求它出矩形的最少门数
分析
- 对于一面最小的不可分割的墙, 某一点到它的某一端如果不和其它墙相交, 直接可以开门穿过, 如果有相交的墙l, 就要先穿过l, 一次向上推, 直至不存在相交的墙, 那么可以直接从中点穿过….
- 所以对于某个给定线段某个端点最小门数就是和其他线段相交数 + 1
- 矩形四个顶点也要考虑
- 所以直接枚举线段的端点和4个顶点求其他线段相交数, 求最小就可
code:
#include <cstdio>#include <cmath>#include <algorithm>using namespace std;typedef double ld;const ld eps = 1e-8;struct Point{ ld x, y; Point(){} Point(ld _x, ld _y) : x(_x), y(_y){}; Point operator - (const Point &rhs) const{ return Point(x - rhs.x, y - rhs.y); } ld operator ^ (const Point &rhs) const{ return x * rhs.y - y * rhs.x; }};struct Line{ Point s, e; Line(){} Line(Point _s, Point _e) : s(_s), e(_e){};};int ok(ld x){ if(fabs(x) < eps) return 0; if(x < 0) return -1; return 1;}bool inter(Line a, Line b){ if(max(a.s.x, a.e.x) < min(b.s.x, b.e.x)) return false; if(max(a.s.y, a.e.y) < min(b.s.y, b.e.y)) return false; if(max(b.s.x, b.e.x) < min(a.s.x, a.e.x)) return false; if(max(b.s.y, b.e.y) < min(a.s.y, a.e.y)) return false; return ok((a.s - b.s) ^ (a.e - b.s)) * ok((a.s - b.e) ^ (a.e - b.e)) <= 0 && ok((b.s - a.s) ^ (b.e - a.s)) * ok((b.s - a.e) ^ (b.e - a.e)) <= 0;}int n;Point p[65];Line l[35];int main(){ //freopen("in.txt", "r", stdin); scanf("%d", &n); ld sx, sy, ex, ey, EX, EY; for(int i = 1; i <= n; ++i){ scanf("%lf%lf%lf%lf", &sx, &sy, &ex, &ey); p[i * 2 - 1] = Point(sx, sy); p[i * 2] = Point(ex, ey); l[i] = Line(p[i * 2 - 1], p[i * 2]); } scanf("%lf%lf", &EX, &EY); Point E(EX, EY); int ans = 0x3f3f3f3f, cnt; for(int i = 1; i <= 2 * n; ++i){ Line tmp(E, p[i]); cnt = 0; for(int j = 1; j <= n; ++j) if(inter(tmp, l[j])) ++cnt; ans = min(ans, cnt); } p[1] = Point(0, 0); p[2] = Point(100, 0); p[3] = Point(0, 100); p[4] = Point(100, 100); for(int i = 1; i <= 4; ++i){ Line tmp(E, p[i]); cnt = 0; for(int j = 1; j <= n; ++j) if(inter(tmp, l[j])) ++cnt; ans = min(ans, cnt + 1); } printf("Number of doors = %d\n", ans); return 0;}
0 0
- POJ 1066 线段相交
- POJ 1066 线段相交
- POJ 1066 线段相交
- POJ 1066 判断线段相交
- POJ 1066 线段相交判断
- POJ 1066 Treasure Hunt (线段相交)
- poj 1066 Treasure Hunt(判断线段相交)
- POJ 1066 两线段的规范相交
- POJ 1066 Treasure Hunt --几何,线段相交
- POJ 1066 Treasure Hunt(线段相交判断)
- POJ 1066 Treasure Hunt(线段相交判断)
- poj 1066 判断线段相交 思维
- POJ 1066 Treasure Hunt 【线段相交】
- POJ 1556 线段相交
- POJ 2653 线段相交
- poj 1127(线段相交)
- POJ 2653 线段相交
- POJ 1066 Treasure Hunt (线段与线段相交) -
- 获取请求的IP地址和浏览器信息
- 关于在windows下面虚拟机创建linux的hadoop配置
- 历届试题 国王的烦恼 (蓝桥杯)
- PAT-乙级 1004.成绩排名(20)
- 802.11abgn与802.11ac的区别以及详细的介绍
- POJ 1066 线段相交
- PCIE之PCIEManager.cpp
- Android常用框架
- JAVA-练习switch的运用
- iOS
- ThinkPHP整合无刷新上传插件Uploadify的使用简介
- C++命名规则------语句
- Android与JS之间的互调
- PCIEZ之sth_util.h