luogu P1354 房间最短路问题 计算几何_Floyd_线段交
第一次写计算几何,还是很开心的吧(虽然题目好水qaq)
暴力枚举端点,暴力连边即可
用线段交判一下是否可行.
Code:
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#define setIO(s) freopen(s".in","r",stdin)
#define maxn 100008
const double eps = 0.00000001;
const double inf = 10000000000.0;
using namespace std;
int n,idx,ls,st,ed;
double map[200][200];
struct Point{ double x,y; Point(double x=0,double y=0):x(x),y(y){} }point[maxn];
struct Line{ Point a,b; }line[maxn];
int exis(double t){ return (fabs(t)<=eps) ? 0 : (t < 0 ? -1 : 1 ) ; }
double det(double x1,double y1,double x2,double y2) { return x1*y2-x2*y1; }
double cross(Point a,Point b,Point c) { return det(b.x-a.x,b.y-a.y,c.x-a.x,c.y-a.y); }
bool check(Point a,Point b,Point c,Point d) {
if((exis(cross(a,c,b)) ^ exis(cross(a,d,b)))==-2 && (exis(cross(d,a,c)) ^ exis(cross(d,b,c))) == -2)
return true;
return false;
}
double dis(Point a,Point b) {
double xx = b.x - a.x;
double yy = b.y - a.y;
return (double)sqrt(xx*xx+yy*yy) ;
}
bool is_ok(int a,int b) {
for(int i=1;i<=ls;++i)
{
if(check(line[i].a,line[i].b,point[a],point[b])) {
return false;
}
}
return true;
}
void addline(double a,double b,double c,double d)
{
line[++ls].a.x = a;
line[ls].a.y = b;
line[ls].b.x = c;
line[ls].b.y = d;
}
void addedge(int u,int v,double dis) { map[u][v] = dis;}
int main(){
//setIO("input");
scanf("%d",&n);
for(int i=1;i<=n;++i) {
double a,b,c,d,x;
scanf("%lf%lf%lf%lf%lf",&x,&a,&b,&c,&d);
point[++idx] = Point(x,a);
point[++idx] = Point(x,b);
point[++idx] = Point(x,c);
point[++idx] = Point(x,d);
addline(x,0,x,a);
addline(x,b,x,c);
addline(x,d,x,10.0);
}
point[++idx] = Point(0,5), st=idx;
point[++idx] = Point(10,5),ed=idx;
for(int i=1;i<=idx;++i)
for(int j=1;j<=idx;++j) map[i][j] = inf;
for(int i=1;i<=idx;++i) map[i][i]=0;
for(int i=1;i<=idx;++i)
for(int j=1;j<i;++j)
if(i!=j&&is_ok(i,j))
addedge(i,j,dis(point[i],point[j])),addedge(j,i,dis(point[i],point[j]));
for(int k=1;k<=idx;++k)
for(int i=1;i<=idx;++i)
for(int j=1;j<=idx;++j)
if(map[i][k]+map[k][j] < map[i][j]) map[i][j] = map[i][k] + map[k][j];
printf("%.2f",map[st][ed]);
return 0;
}
luogu P1354 房间最短路问题 计算几何_Floyd_线段交的更多相关文章
- [Luogu P1354]房间最短路问题
这是一道紫题,然而实际上我觉得也就蓝题难度甚至不到. and,这道题就是一道数学题,代码模拟计算过程. 求最短路嘛,肯定要考虑建图,只需要把中间的墙上每个口的边缘处的点作为图中的点就行.至于为什么,显 ...
- luogu 1354 房间最短路问题 线段与直线相交 最短路
题目链接 题目描述 在一个长宽均为10,入口出口分别为(0,5).(10,5)的房间里,有几堵墙,每堵墙上有两个缺口,求入口到出口的最短路经. 输入输出格式 输入格式: 第一排为n(n<=20) ...
- P1354 房间最短路问题
传送门 可以发现,最短路一定要经过墙壁的断点. 那么把房间看作一个有向图,墙壁的断点为节点,求从起点到终点的最短路. 这道题的难点在于建图.枚举所有的断点,若可以走则加入这条边. 判断两点是否连通,即 ...
- POJ 1556 The Doors 线段交 dijkstra
LINK 题意:在$10*10$的几何平面内,给出n条垂直x轴的线,且在线上开了两个口,起点为$(0, 5)$,终点为$(10, 5)$,问起点到终点不与其他线段相交的情况下的最小距离. 思路:将每个 ...
- POJ 1556 The Doors(线段交+最短路)
The Doors Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 5210 Accepted: 2124 Descrip ...
- 最短路+线段交 POJ 1556 好题
// 最短路+线段交 POJ 1556 好题 // 题意:从(0,5)到(10,5)的最短距离,中间有n堵墙,每堵上有两扇门可以通过 // 思路:先存图.直接n^2来暴力,不好写.分成三部分,起点 终 ...
- POJ 3304 Segments 基础线段交判断
LINK 题意:询问是否存在直线,使得所有线段在其上的投影拥有公共点 思路:如果投影拥有公共区域,那么从投影的公共区域作垂线,显然能够与所有线段相交,那么题目转换为询问是否存在直线与所有线段相交.判断 ...
- UVa 10256(凸包、线段交、点在多边形内)
要点 红蓝点分别求凸包显然 判断两凸包是否相交方法:所有红点不在蓝凸包内,反之亦然:所有红凸包线不与蓝凸包线相交,反之亦然. 书上让特判一下凸包退化成点或线段的情况,为什么我感觉代码仓库的代码并没特判 ...
- HDU 4637 Rain on your Fat brother 线段与半圆和线段交 简单题
题意: 应该不难读懂. 做法: 我们可以把雨滴看做静止不动,然后maze(这题的那个人)就是往左上方运动就可以了,计算出maze能跑到的最远的点,然后就是求起点和终点所构成的线段与每个雨滴交的时间,注 ...
随机推荐
- PHP迭代器的内部执行过程
下面我们来了解如何实现一个自定义的迭代器,然后再开始慢慢理解迭代器的内部工作原理.先来看一个官方的例子: class myIterator implements Iterator { private ...
- el7上的开机自动执行脚本
/etc/rc.local 是 /etc/rc.d/rc.local的软连接 默认, /etc/rc.local 是有可执行权限的, 只要 给 /etc/rc.d/rc.local 加上可执行权限即可 ...
- UEditor如何读取数据库信息?
你用的什么语言,服务器端生成的时候,直接写在里面就可以了啊,比如 <textarea name="content" cols="800" rows=&qu ...
- nyoj212-k尾相等数
212-K尾相等数 内存限制:64MB时间限制:3000msSpecial Judge: No accepted:0submit:0 题目描述: 输入一个自然数K(K>1),如果存在自然数M和N ...
- 接口(interface) 可以 new()吗???~
比如 一个接口 A ,里面有一个方法fun1(),一般我们是先定义它的实现再引用它,比如 public class ImpA implements A{ public void fun1(){ //d ...
- Ajax发送XML请求案例
Ajax发送XML请求需求: 根据输入的国家,输出这些国家下面的城市. 如果请求参数较多,而且请求参数的结构关系复杂,则可以考虑发送XML请求.XML请求的实质还是POST请求,只是在发送请求的客户端 ...
- BA-风阀水阀执行器接线图
220水阀执行器接线图 24V风阀执行器接线图
- 关于excel导入、导出(POI)
当前B/S模式已成为应用开发的主流,而在企业办公系统中,常常有客户这样子要求:你要把我们的报表直接用Excel打开(电信系统.银行系统).或者是:我们已经习惯用Excel打印.这样在我们实际的开发中, ...
- HDU 4767
昨晚苦恼了一晚,因为即将大三了,必须要准备实习什么的事了.一般都会去公司实习吧,但是看看自己的简历,实在拿不出手,因为大一大二都在搞ACM(虽然真正搞的只有大二一年),但却没有什么成绩,又不愿意做项目 ...
- 【C++】通用单链表
在C++的学习中,採用模板类,而採用虚函数实现多态性.达到通用的目的.结点类数据域被改造为指针,而把数据放在一个抽象类中.由指针与之建立联系. 採用虚函数实现多态性,达到通用的目的.堆内存的分配与释放 ...