[Luogu P1354]房间最短路问题
这是一道紫题,然而实际上我觉得也就蓝题难度甚至不到。
and,这道题就是一道数学题,代码模拟计算过程。
求最短路嘛,肯定要考虑建图,只需要把中间的墙上每个口的边缘处的点作为图中的点就行。至于为什么,显然如果我们取中间任何一个点连边,到下一面墙时路径之和总是比连其中一个边缘的点要大,直观感(gán觉(juě)一下就行。连边我们一定会遇到一个问题,就是会被墙挡住。解决办法就是一次函数。我们求出要连这条边的直线解析式(直接模拟计算过程就行),然后求出在中间的墙上的函数值,如果这个函数值正好在缺口处就可以,否则被墙挡住,中间有多面墙枚举就行。
当我们建完图后这题就是最短路板子题了。n<=20,直接Floyd就水过去了。
据说lbg直接用dfs暴力水过去了,tql!
参考代码:
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<queue>
#define N 100
using namespace std;
int s;
double dis[N][N];
struct wall
{
double x;
double y[];
}w[];
bool check(int a,int b,int na,int nb)
{
if(b - a <= ) return ;
double ya = w[a].y[na],yb = w[b].y[nb],xa = w[a].x,xb = w[b].x;
double k = (ya - yb) / (xa - xb);
double bb = ya - k * xa;//模拟待定系数法
for(int i = a + ;i < b;i++)
{
double y = w[i].x * k + bb;
if(y < w[i].y[] || (y > w[i].y[] && y < w[i].y[]) || y > w[i].y[]) return ;//判断是否被墙挡住
}
return ;
}
void add(int a,int b,int na,int nb)
{
if(!check(a,b,na,nb)) return;
dis[ * a + na][ * b + nb] = dis[ * b + nb][ * a + na] = sqrt((w[a].x - w[b].x) * (w[a].x - w[b].x) + (w[a].y[na] - w[b].y[nb]) * (w[a].y[na] - w[b].y[nb]));//连边,边权为两点间距离
}
void reset()
{
for(int i = ;i <= N;i++)
{
for(int j = ;j <= N;j++)
{
if(i != j) dis[i][j] = 1e8;
else dis[i][j] = ;
}
}
}
void floyd()
{
for(int k = ;k <= * s + ;k++)
{
for(int i = ;i <= * s + ;i++)
{
for(int j = ;j <= * s + ;j++)
{
dis[j][i] = dis[i][j] = min(dis[i][j],dis[i][k] + dis[k][j]);
}
}
}
return;
}
int main()
{
reset();
scanf("%d",&s);
for(int i = ;i <= s;i++)
{
scanf("%lf %lf %lf %lf %lf",&w[i].x,&w[i].y[],&w[i].y[],&w[i].y[],&w[i].y[]);
}
w[].x = ;w[++s].x = ;
for(int i = ;i <= ;i++) w[].y[i] = w[s].y[i] = ;
for(int a = ;a < s;a++)
{
for(int b = a + ;b <= s;b++)
{
for(int na = ;na <= ;na++)
{
for(int nb = ;nb <= ;nb++)
{
if(a == b) continue;
add(a,b,na,nb);
}
}
}
}
floyd();
printf("%.2lf",dis[][ * s + ]); }
[Luogu P1354]房间最短路问题的更多相关文章
- luogu P1354 房间最短路问题 计算几何_Floyd_线段交
第一次写计算几何,还是很开心的吧(虽然题目好水qaq) 暴力枚举端点,暴力连边即可 用线段交判一下是否可行. Code: #include <cstdio> #include <al ...
- P1354 房间最短路问题
传送门 可以发现,最短路一定要经过墙壁的断点. 那么把房间看作一个有向图,墙壁的断点为节点,求从起点到终点的最短路. 这道题的难点在于建图.枚举所有的断点,若可以走则加入这条边. 判断两点是否连通,即 ...
- luogu 1354 房间最短路问题 线段与直线相交 最短路
题目链接 题目描述 在一个长宽均为10,入口出口分别为(0,5).(10,5)的房间里,有几堵墙,每堵墙上有两个缺口,求入口到出口的最短路经. 输入输出格式 输入格式: 第一排为n(n<=20) ...
- 【u026】房间最短路问题
描述 在一个长宽均为10,入口出口分别为(0,5).(10,5)的房间里,有几堵墙,每堵墙上有两个缺口,求入口到出口的最短路经. 格式 输入格式 第一排为n(n<=20),墙的数目. 接下来n排 ...
- luoguP1354房间最短路问题
判断两点间连通性,建图跑floyed #include<bits/stdc++.h> using namespace std; ; struct node { ],x; }q[N];dou ...
- 状压DP复习笔记
前言 复习笔记第4篇.CSP RP++. 引用部分为总结性内容. 0--P1433 吃奶酪 题目链接 luogu 题意 房间里放着 \(n\) 块奶酪,要把它们都吃掉,问至少要跑多少距离?一开始在 \ ...
- 【BZOJ4031】【Luogu P4111】[HEOI2015]小Z的房间
裸的矩阵树定理.求行列式的时候答案要在中间统计,因为交换两个行会使答案取反. #include <bits/stdc++.h> using namespace std; const int ...
- Luogu 1060 开心的金明 / NOIP 2006 (动态规划)
Luogu 1060 开心的金明 / NOIP 2006 (动态规划) Description 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间.更让他高兴的是,妈妈昨 ...
- Luogu 1064 金明的预算方案 / CJOJ 1352 [NOIP2006] 金明的预算方案(动态规划)
Luogu 1064 金明的预算方案 / CJOJ 1352 [NOIP2006] 金明的预算方案(动态规划) Description 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己 ...
随机推荐
- spring笔记----看书笔记
上周末看了一章以前javaee轻量级的书spring部分,简单做了一些笔记 // ApplicationContext ac=new ClassPathXmlApplicationContext(&q ...
- SQLServer之创建不可重复读
创建不可重复读注意事项 语法:set transaction isolation level repeatable read. 指定语句不能读取已由其他事务修改但尚未提交的行,并且指定,其他任何事务都 ...
- VS2017 community版使用码云(gitee)的一些过程,看图学习,傻瓜式教程
首先你得有一个gitee账号,VS2017IDE开发工具 第一步,打开VS2017,点击菜单栏上->工具->扩展与更新,如图 然后点击 联机 然后输入 gitee 回车搜索 一定要选择我圈 ...
- 教你在浏览器里做出EXCEL的效果
在浏览器里做出EXCEL的效果,复制.粘贴.设置公式.双击编辑等效果,如果自己开发的话,比较麻烦,建议使用成熟的插件.这里介绍使用智表ZCELL插件,实现用户快捷操作. 首先下载插件,引入到页面中,一 ...
- npm基本操作(安装,搭建环境,打包)
Nodejs(npm)环境安装: npm的安装配置(从nodejs网站上安装npm): Windows安装Nodejs操作步骤如下: 64 位安装包下载地址 : https://nodejs.org/ ...
- Linux命令之常用篇
一.文件和目录 1. cd命令 它用于切换当前目录,它的参数是要切换到的目录的路径,可以是绝对路径,也可以是相对路径. 指令 说明 cd /home 进入‘home’目录 cd .. 返回上一级目录 ...
- python day05
数字类型 1.整型:整数 num = 1000000000000 type(num) --->int 2.浮点型:小数 num = 123.2341 type(num) --->float ...
- git命令的理解与扩展
Git的模式如图: Workspace:工作区 Index / Stage:暂存区 Repository:仓库区(或本地仓库) Repository:仓库区(或本地仓库) 一.新建代码库 # 查看gi ...
- js中uuid不被识别
后台传了uuid值给前台,然后js报错 原因:反正就是js不认你这个字符串,他觉得你这是应该是数字,但是后面想了想,也不是数字啊,然后就不认了. 解决办法:告诉他,为夫这里是字符串.拼接html的时候 ...
- 我的工具:Ping工具
C# Ping工具 通过该工具可以多个地点Ping服务器以检测服务器响应速度,同时也可以测试网站的响应速度,解析时间,服务器连接时间,下载速度 工具下载地址:https://download.csdn ...