这是一道紫题,然而实际上我觉得也就蓝题难度甚至不到。

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]房间最短路问题的更多相关文章

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

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

  2. P1354 房间最短路问题

    传送门 可以发现,最短路一定要经过墙壁的断点. 那么把房间看作一个有向图,墙壁的断点为节点,求从起点到终点的最短路. 这道题的难点在于建图.枚举所有的断点,若可以走则加入这条边. 判断两点是否连通,即 ...

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

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

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

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

  5. luoguP1354房间最短路问题

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

  6. 状压DP复习笔记

    前言 复习笔记第4篇.CSP RP++. 引用部分为总结性内容. 0--P1433 吃奶酪 题目链接 luogu 题意 房间里放着 \(n\) 块奶酪,要把它们都吃掉,问至少要跑多少距离?一开始在 \ ...

  7. 【BZOJ4031】【Luogu P4111】[HEOI2015]小Z的房间

    裸的矩阵树定理.求行列式的时候答案要在中间统计,因为交换两个行会使答案取反. #include <bits/stdc++.h> using namespace std; const int ...

  8. Luogu 1060 开心的金明 / NOIP 2006 (动态规划)

    Luogu 1060 开心的金明 / NOIP 2006 (动态规划) Description 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间.更让他高兴的是,妈妈昨 ...

  9. Luogu 1064 金明的预算方案 / CJOJ 1352 [NOIP2006] 金明的预算方案(动态规划)

    Luogu 1064 金明的预算方案 / CJOJ 1352 [NOIP2006] 金明的预算方案(动态规划) Description 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己 ...

随机推荐

  1. SQL Server数据库————模糊查询和聚合函数

    ***********模糊查询*********/ 关键字: like (!!!!字符串类型) in (,,)  匹配()内的某个具体值(括号里可以写多个值) between... and.. 在某两 ...

  2. Spring JPA 使用@CreatedDate、@CreatedBy、@LastModifiedDate、@LastModifiedBy 自动生成时间和修改者

    JPA Audit 在spring jpa中,支持在字段或者方法上进行注解@CreatedDate.@CreatedBy.@LastModifiedDate.@LastModifiedBy,从字面意思 ...

  3. 随机IP

    function rand_ip(){ $ip_longs = array( array('607649792', '608174079'),        //36.56.0.0-36.63.255 ...

  4. SQLSTATE[HY000]: General error: 1030 Got error 28 from storage engine

    今天上课程化平台考试,输入平台网址突然报这个错误 可以先df -h 发现/tmp文件使用满了 ,清理下不需要的临时文件即可

  5. Problem of Creating Topics in Kafka with Kerberos

    Hi, After enabled Kerberos using Ambari, I got problem creating topics in Kafka using the kafka-topi ...

  6. 菜鸟学python之程序初体验

    作业来源:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/2684 1.字符串操作: 解析身份证号:生日.性别.出生地等. def id ...

  7. 【git】git hello world

    以前不怎么会用. http://blog.sina.com.cn/s/blog_1485511700102xdig.html git add 文件夹/            添加整个文件夹及内容 gi ...

  8. Flask自定义转换器,实现路由匹配正则表达式参数

    Flask框架动态路由实现参数传递和Django框架有类似之处,但是相比于Django框架,Flask实现复杂的参数就需要自己自定义转换器来实现了,而不能向Django那样直接使用正则表达式 # 路由 ...

  9. flutter Provide 状态管理篇

    Provide是Google官方推出的状态管理模式.官方地址为: https://github.com/google/flutter-provide 现在Flutter的状态管理方案很多,redux. ...

  10. golang核心Goroutine和channel

    一.Goroutine 1.介绍 goroutine简介 goroutine是go语言中最为NB的设计,也是其魅力所在,goroutine的本质是协程,是实现并行计算的核心.goroutine使用方式 ...