POJ 1127_Jack Straws
2016-03-06 22:58
281 查看
%:
对于二维向量p1=(x1,y1),p2=(x2,y2),定义内积p1⋅p2=x1x2+y1y2,外积p1×p2=x1y2−y1x2,则判断点q是否在线段p1−p2上:先利用外积判断q是否在直线p1p2上,(p1−q)×(p2−q)=0;
再利用内积判断q是否在线段p1−p2上,(p1−q)×(p2−q)≤0;
设直线p1−p2上的点为p1+t(p2−p1),则该点在线段q1−q2上有:(q1−q2)×(p1+t(p2−p1)−q2)=0
则交点为:p1+(q1−q2)×(q2−p1)(q1−q2)×(p2−p1)(p2−p1)
题意:
给定n根木棍的坐标,求给定两个木棍是否相交,若两根木棍通过相连的木棍连接,则也视为相连。判断给定的两个木块是否相连。分析:
判断两条线段是否相交,注意平行的时候要判断是否重合。代码:
#include<cstdio> #include<cmath> #include<iostream> using namespace std; const int maxn = 25; bool g[maxn][maxn]; double eps = 1e-10; double add(double a, double b) { if(abs(a + b) < eps * (abs(a) + abs(b))) return 0; else return a + b; } //二维向量结构体 struct P{ double x, y; P() {} P(double x, double y) : x(x), y(y){} P operator + (P p){ return P(add(x, p.x), add(y, p.y)); } P operator -(P p){ return P(add(x, -p.x), add(y, -p.y)); } double dot(P p){ return add(x * p.x, y *p.y); } double det(P p){ return add(x * p.y, - y * p.x); } P operator *(double d){ return P(x * d, y * d); } }; P p[maxn], q[maxn]; bool onseg(P p1, P p2, P q) { return (p1 - q).det(p2 - q) == 0 && (p1 - q).dot(p2 - q) <= 0; } P intersection(P p1, P p2, P q1, P q2) { return p1 + (p2 - p1) * ((q2 - q1).det(q1 - p1) / (q2 - q1).det(p2 - p1)); } int main (void) { int n; while(scanf("%d",&n) && n){ for(int i = 0; i < n; i++){ scanf("%lf%lf%lf%lf", &p[i].x, &p[i].y, &q[i].x, &q[i].y); } for(int i = 0; i < n; i++){ g[i][i] = true; for(int j = 0; j < i; j++){ if((p[i] - q[i]).det(p[j] - q[j]) == 0){ g[i][j] = g[j][i] = onseg(p[i], q[i], p[j])||onseg(p[j], q[j], p[i])||onseg(p[i], q[i], q[j])||onseg(p[j], q[j], q[i]); }else{ P tmp = intersection(p[i], q[i], p[j], q[j]); g[i][j] = g[j][i] = onseg(p[i], q[i], tmp) && onseg(p[j], q[j], tmp); } } } for(int k = 0; k < n; k++){ for(int i = 0; i < n; i++){ for(int j = 0; j < n; j++) g[i][j] |= g[i][k] && g[k][j]; } } int a, b; while(scanf("%d%d",&a, &b)&&a + b){ if(g[a - 1][b - 1]) printf("CONNECTED\n"); else printf("NOT CONNECTED\n"); } } }
这题判断是否相连的时候可以用并查集做,《挑战》上使用的是Floyd算法判断任意两点间是否相连,感觉很巧妙~~
书上提到了complex类,可是感觉只能做向量的加减法???
相关文章推荐
- 12. 代理模式
- 基于CentOS7开发之路 --- 第二章 : CentOS 7 配置Java环境变量
- Msbuild利用cpu多核加速
- Unity圣典网址
- iOSUITableView自动布局 ----动态cell
- Linux下网络流量实时监控工具 大全
- 242. Valid Anagram
- springMVC前端请求找不到资源路径(HTTP Status 404)问题
- 通用JSON数据生成器
- 根结点到所有叶子结点的路径问题
- 怎么让网站在本地支持SSL?
- 对于软件工程的认识与疑问
- xz压缩与解压缩
- 杨帆远航_长空569的第一篇博客
- 用C#连接Access数据库做登录界面
- 【POJ】1101 - The Game(bfs,连连看问题)
- web service 传递复杂对象
- android生命周期详解
- UI基础 简单图片轮播器用到的知识
- WebPack实例与前端性能优化