P1354 房间最短路问题
可以发现,最短路一定要经过墙壁的断点。
那么把房间看作一个有向图,墙壁的断点为节点,求从起点到终点的最短路。
这道题的难点在于建图。枚举所有的断点,若可以走则加入这条边。
判断两点是否连通,即为判断两点之间是否有其他墙壁阻隔。
两点的连线可以看作一个一次函数$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 房间最短路问题的更多相关文章
- [Luogu P1354]房间最短路问题
这是一道紫题,然而实际上我觉得也就蓝题难度甚至不到. and,这道题就是一道数学题,代码模拟计算过程. 求最短路嘛,肯定要考虑建图,只需要把中间的墙上每个口的边缘处的点作为图中的点就行.至于为什么,显 ...
- luogu P1354 房间最短路问题 计算几何_Floyd_线段交
第一次写计算几何,还是很开心的吧(虽然题目好水qaq) 暴力枚举端点,暴力连边即可 用线段交判一下是否可行. Code: #include <cstdio> #include <al ...
- 【u026】房间最短路问题
描述 在一个长宽均为10,入口出口分别为(0,5).(10,5)的房间里,有几堵墙,每堵墙上有两个缺口,求入口到出口的最短路经. 格式 输入格式 第一排为n(n<=20),墙的数目. 接下来n排 ...
- luogu 1354 房间最短路问题 线段与直线相交 最短路
题目链接 题目描述 在一个长宽均为10,入口出口分别为(0,5).(10,5)的房间里,有几堵墙,每堵墙上有两个缺口,求入口到出口的最短路经. 输入输出格式 输入格式: 第一排为n(n<=20) ...
- luoguP1354房间最短路问题
判断两点间连通性,建图跑floyed #include<bits/stdc++.h> using namespace std; ; struct node { ],x; }q[N];dou ...
- ACM/ICPC 之 DP解有规律的最短路问题(POJ3377)
//POJ3377 //DP解法-解有规律的最短路问题 //Time:1157Ms Memory:12440K #include<iostream> #include<cstring ...
- ACM 房间安排
房间安排 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 2010年上海世界博览会(Expo2010),是第41届世界博览会.于2010年5月1日至10月31日期间, ...
- 房间安排-nyoj168
描述 2010年上海世界博览会(Expo2010),是第41届世界博览会.于2010年5月1日至10月31日期间,在中国上海市举行.本次世博会也是由中国举办的首届世界博览会.上海世博会以“城市,让生活 ...
- 房间声学原理与Schroeder混响算法实现
一.混响时间的计算与预测 所谓混响就是声音的直达声与反射声很紧凑的重合在一起时人耳所听到的声音,这个效果在语音的后期处理时特别有用.能产生混响最常见的场景就是房间内,尤其是空旷的房间中. 混响有直达声 ...
随机推荐
- 跨站脚本攻击xss学习
0.认识跨站脚本 举一个跨站脚本的简单例子. 假设一个页面将用户输入的参数直接显示到页面之中.(比如有如下代码) 在实际的浏览器中,在param中提交的参数正常会展示到页面之中.比如输入下面的URL: ...
- webpack4.0各个击破(4)—— Javascript & splitChunk
目录 一. Js模块化开发 二. Js文件的一般打包需求 三. 使用webpack处理js文件 3.1 使用babel转换ES6+语法 3.2 脚本合并 3.3 公共模块识别 3.4 代码分割 3.5 ...
- Linux命令行对文件某(些)行的提取
[一]从第3000行开始,显示1000行.即显示3000~3999行 cat filename | tail -n +3000 | head -n 1000 [二]显示1000行到3000行 cat ...
- 17 , CSS 区块、浮动、定位、溢出、滚动条
1.CSS 中区块的使用 2.CSS 中浮动的使用 3.CSS 中定位的使用 4.CSS 中溢出的使用 5.CSS 中滚动条的使用 17.1 CSS 中区块的使用 属性名称 属性值 说明 width ...
- Error: No PostCSS Config found in... 报错 踩坑记
项目在本地运行不报错,上传到 GitHub 之后,再 clone 到本地,执行: npm install 安装完成之后再执行: npm run dev 这时报错 Error: No PostCSS C ...
- Dynamics 365中配置和使用文件夹级别的跟踪(folder-level tracking)
本人微信和易信公众号:微软动态CRM专家罗勇 ,回复274或者20180630可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong.me ...
- arcgis api 3.x for js 共享干货系列之二自定义 Navigation 控件样式风格(附源码下载)
0.内容概览 自定义 Navigation 控件样式风格 源码下载 1.内容讲解 arcgis api 3.x for js 默认的Navigation控件样式风格如下图:这样的风格不能说不好,各有各 ...
- Java新知识系列 七
抽象类和接口的区别和特点 java的JDK中包含的五个工具 编译型语言和解释型语言 Java和C++的区别` 常见的ASCII的值 Forward和Redirect之间的对比 Web Service ...
- java新知识系列 六
sleep和wait的区别有: Servlet方法的使用 方法重写的规则,以及两同两小一大原则: DispatcherServlet的解析 依赖注入DU和控制反转Ioc AOP和OOP的区别 Spri ...
- Linux & Windows 环境下 Redis 安装与基本配置
索引: 目录索引 参看代码 GitHub: redis.txt 一.Linux (DeepinOS) 环境 .安装Redis服务 sudo apt-get install redis-server . ...