传送门

可以发现,最短路一定要经过墙壁的断点。

那么把房间看作一个有向图,墙壁的断点为节点,求从起点到终点的最短路。

这道题的难点在于建图。枚举所有的断点,若可以走则加入这条边。

判断两点是否连通,即为判断两点之间是否有其他墙壁阻隔。

两点的连线可以看作一个一次函数$y=kx+B$,

$k=(x2-x1)/(y2-y1),B=y1-k*x1$

得到函数解析式后,算出中间的每一个墙壁与这条直线交点的$y$坐标,

由于给出墙壁的$x$是递增的,所以只需要枚举墙壁$x1+1$~$x2-1$。

若这个$y$恰好在墙壁的缺口里,则是连通的。

边的权值即为两点之间的欧几里德距离:$sqrt( (x2-x1)^2 + (y2-y1)^2 )$

边的序号:由于一条墙壁只有四个断点,则某个断点的序号可以记作$x*4+y[i]$,$i$为第几个断点。

数据范围很小,最后用floyd求出最短路即可。

注意开double!

代码如下

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#define MogeKo qwq
using namespace std;
const int maxn = ;
const int INF = ;
int n; double e[][]; struct wall {
double x,y[];
} w[maxn]; bool check(int a,int b,int g1,int g2) {
if(b-a<)return true;
double xi = w[a].x,xii = w[b].x;
double yi = w[a].y[g1],yii = w[b].y[g2];
double k = (yii-yi)/(xii-xi);
double B = yi-k*xi;
for(int i = a+; i <= b-; i++) {
double yy = k*w[i].x+B;
if(!((yy>w[i].y[]&&yy<w[i].y[])||(yy>w[i].y[]&&yy<w[i].y[])))return false;
}
return true;
} void add(int a,int b,int g1,int g2) {
if(!check(a,b,g1,g2))return;
double xi = w[a].x,xii = w[b].x;
double yi = w[a].y[g1],yii = w[b].y[g2];
e[(a<<)+g1][(b<<)+g2] = sqrt(pow(xii-xi,)+pow(yii-yi,));
} void floyd() {
for(int k = ; k <= (n<<)+; k++)
for(int i = ; i <= (n<<)+; i++)
for(int j = ; j <= (n<<)+; j++)
e[i][j] = min(e[i][j],e[i][k]+e[k][j]);
} int main() {
scanf("%d",&n);
for(int i = ; i <= n; i++) {
scanf("%lf",&w[i].x);
for(int j = ; j <= ; j++)
scanf("%lf",&w[i].y[j]);
}
w[].x = ,w[++n].x = ;
for(int i = ; i <= ; i++)
w[].y[i] = w[n].y[i] = ;
for(int i = ; i <= (n<<)+; i++)
for(int j = ; j <= (n<<)+; j++)
e[i][j] = INF;
for(int i = ; i <= n; i++)
for(int j = i+; j <= n; j++)
for(int k = ; k <= ; k++)
for(int l = ; l <= ; l++)
add(i,j,k,l);
floyd();
printf("%.2lf",e[][(n<<)+]);
return ;
}

P1354 房间最短路问题的更多相关文章

  1. [Luogu P1354]房间最短路问题

    这是一道紫题,然而实际上我觉得也就蓝题难度甚至不到. and,这道题就是一道数学题,代码模拟计算过程. 求最短路嘛,肯定要考虑建图,只需要把中间的墙上每个口的边缘处的点作为图中的点就行.至于为什么,显 ...

  2. luogu P1354 房间最短路问题 计算几何_Floyd_线段交

    第一次写计算几何,还是很开心的吧(虽然题目好水qaq) 暴力枚举端点,暴力连边即可 用线段交判一下是否可行. Code: #include <cstdio> #include <al ...

  3. 【u026】房间最短路问题

    描述 在一个长宽均为10,入口出口分别为(0,5).(10,5)的房间里,有几堵墙,每堵墙上有两个缺口,求入口到出口的最短路经. 格式 输入格式 第一排为n(n<=20),墙的数目. 接下来n排 ...

  4. luogu 1354 房间最短路问题 线段与直线相交 最短路

    题目链接 题目描述 在一个长宽均为10,入口出口分别为(0,5).(10,5)的房间里,有几堵墙,每堵墙上有两个缺口,求入口到出口的最短路经. 输入输出格式 输入格式: 第一排为n(n<=20) ...

  5. luoguP1354房间最短路问题

    判断两点间连通性,建图跑floyed #include<bits/stdc++.h> using namespace std; ; struct node { ],x; }q[N];dou ...

  6. ACM/ICPC 之 DP解有规律的最短路问题(POJ3377)

    //POJ3377 //DP解法-解有规律的最短路问题 //Time:1157Ms Memory:12440K #include<iostream> #include<cstring ...

  7. ACM 房间安排

    房间安排 时间限制:3000 ms  |  内存限制:65535 KB 难度:2   描述 2010年上海世界博览会(Expo2010),是第41届世界博览会.于2010年5月1日至10月31日期间, ...

  8. 房间安排-nyoj168

    描述 2010年上海世界博览会(Expo2010),是第41届世界博览会.于2010年5月1日至10月31日期间,在中国上海市举行.本次世博会也是由中国举办的首届世界博览会.上海世博会以“城市,让生活 ...

  9. 房间声学原理与Schroeder混响算法实现

    一.混响时间的计算与预测 所谓混响就是声音的直达声与反射声很紧凑的重合在一起时人耳所听到的声音,这个效果在语音的后期处理时特别有用.能产生混响最常见的场景就是房间内,尤其是空旷的房间中. 混响有直达声 ...

随机推荐

  1. Django学习笔记(6)——Form表单

    知识储备:HTML表单form学习 表单,在前端页面中属于最常见的一个东西了.基本上网站信息的提交都用到了表单,所以下面来学习Django中优雅的表单系统:Form 表单的主要作用是在网页上提供一个图 ...

  2. spring-boot-2.0.3启动源码篇四 - run方法(三)之createApplicationContext

    前言 此系列是针对springboot的启动,旨在于和大家一起来看看springboot启动的过程中到底做了一些什么事.如果大家对springboot的源码有所研究,可以挑些自己感兴趣或者对自己有帮助 ...

  3. 痞子衡嵌入式:第一本Git命令教程(7.1)- 清理之缓存(stash)

    今天是Git系列课程第七课,上一课我们学会了查看Git本地历史提交,今天痞子衡要讲的是Git仓库的清理操作,一共4个命令,都是日常开发中非常实用的命令,掌握这4个命令,会让你有一种玩弄Git仓库于股掌 ...

  4. 【深度学习系列】卷积神经网络CNN原理详解(一)——基本原理

    上篇文章我们给出了用paddlepaddle来做手写数字识别的示例,并对网络结构进行到了调整,提高了识别的精度.有的同学表示不是很理解原理,为什么传统的机器学习算法,简单的神经网络(如多层感知机)都可 ...

  5. [PHP] foreach循环的引用赋值可能导致的问题

    foreach($arr as &$value)1.引用赋值符号&,是每次循环的时候,把当前元素变成地址,$value变量就是对应元素的地址,循环结束$value是一个指向最后一个元素 ...

  6. php ip2long负数的问题

    大家可能都知道php提供了ip2long与long2ip方法对ip地址处理.抛砖引玉,说点概念性滴: 1.ip2long — 将一个IPV4的字符串互联网协议转换成数字格式 int ip2long ( ...

  7. 31.C++-虚函数之构造函数与析构函数分析

    1.构造函数不能为虚函数 当我们将构造函数定义为虚函数时,会直接报错: 首先回忆下以前学的virtual虚函数概念: 如果类定义了虚函数,创建对象时,则会分配内存空间,并且为该父类以及其所有子类的内存 ...

  8. Eclipse Ctrl+Space 无法工作的问题

    Window->preference->Keys 然后找到content Assist,然后重新设置为自己想要的Short cut 就好了

  9. 开源负载测试工具k6比JMeter更容易的5件事

    k6是GitHub上提供的开源负载测试工具.它是用Go编写的,并运行用JavaScript编写的测试脚本.它受到了开发人员,测试人员和DevOps团队的强烈兴趣,并拥有超过4400名GitHub明星. ...

  10. input 图片上传,第二次上传同一张图片失效

    <input type="file" onchange="angular.element(this).scope().addPhoto(this,event)&qu ...