题目

给顶一个内含阻碍墙的房间,求解出一条从起点到终点的最最短路径。房间的边界 固定在 x=0,x=10,y=0 和 y=10。起点和重点固定在(0,5)和(10,5)。房间里还有 0 到 18 个 墙,每个墙有两个门。输入给定的墙的个数,每个墙的 x 位置和两个门的 y 坐标区间, 输出最短路的长度。

解题思路

虽然在这个房间里可以用很多种走法,但实际上图的节点只有墙壁的端点和始末点就行了。就比如(4,2),(4,7),(4,9),(7,4.5)(4,2),(4,7),(4,9),(7,4.5)等点,然后把这些点相连建图就可以了。我们把起点终点和每堵墙的a1,b1,a2,b2都看做图上的顶点。要完成建图,我们需要找出所有连通的路径,也就是可以直接相邻的两个顶点,完成建边。我们需要判断两点间是否没有阻碍,利用一次函数,求出连结两点的线段与每堵墙所在直线的交点,然后判断交点是否在墙洞,如果都不会被所有墙挡,那么这两个点就可以建一条边,该边的权值就是这两点之间的距离,可以通过公式求出。最后利用弗洛伊德算法求出最短路径即可。

细节说明

直线求解
就是简单的一次函数

运行结果

测试数据

输入
2
4 2 7 8 9
7 3 4.5 6 7
输出
10.06

源代码

#include <iostream>
#include <math.h>
#include <algorithm>
using namespace std;
struct wall {//封装墙的横坐标和每个断点的纵坐标double x;double y[5];
}w[20];
int n;//墙壁数量
double e[85][85];//邻接矩阵
//判断墙wa1上的n1点,是否可以直接与墙wa2上的n2点连接
bool canLink(int wa1, int wa2, int n1, int n2) {if (wa2 - wa1 == 1) {//两堵墙相邻肯定可以连接return true;}//求出两点所在的直线信息double x1 = w[wa1].x, x2 = w[wa2].x;//横坐标double y1 = w[wa1].y[n1], y2 = w[wa2].y[n2];//纵坐标double k = (y2 - y1) / (x2 - x1);//斜率double b = y1 - x1 * k;//截距//判断是否可行//遍历wa1到wa2之间的所有墙壁for (int i = wa1 + 1; i < wa2; i++) {double y = k * w[i].x + b;//直线经过墙y的纵坐标//与墙i有交点,不可连接if (y<w[i].y[1] || y>w[i].y[2] && y<w[i].y[3] || y>w[i].y[4]) {return false;}}//没有交点,可连接return true;
}
//建边 连接墙wa1上的断点n1与墙wa2上的断点n2
void addEdge(int wa1, int wa2, int n1, int n2) {if (!canLink(wa1, wa2, n1, n2)) {//有阻挡不可直接连接return;}double x1 = w[wa1].x, x2 = w[wa2].x;//横坐标double y1 = w[wa1].y[n1], y2 = w[wa2].y[n2];//纵坐标double dist = sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));//两点间距离e[wa1 * 4 + n1][wa2 * 4 + n2] = dist;e[wa2 * 4 + n2][wa1 * 4 + n1] = dist;//储存代表边的权值
}
int main() {cout << "输入墙的数量:";cin >> n;//初始化矩阵e,所有边都设为不通,权值无穷大memset(e, 127, sizeof(e));//输入墙的信息cout << "请输入墙的信息:" << endl;for (int i = 1; i <= n; i++) {cin >> w[i].x;for (int j = 1; j <= 4; j++) {cin >> w[i].y[j];}}//初始化起点与终点w[0].x = 0;w[++n].x = 10;for (int i = 1; i <= 4; i++) {w[0].y[i] = 5;w[n].y[i] = 5;}//建边for (int i = 0; i < n; i++) {//第i堵墙for (int j = i + 1; j <= n; j++) {//第堵墙到第j堵墙for (int k = 1; k <= 4; k++) {//第i堵墙上的第k个结点for (int t = 1; t <= 4; t++) {//第j堵墙上的第t个结点addEdge(i, j, k, t);}}}}for (int i = 0; i < 85; i++) {e[i][i] = 0;//对角线上为0}//弗洛伊德算法求最短路径for (int k = 1; k <= n * 4 + 4; k++) {for (int i = 1; i <= n * 4 + 4; i++) {for (int j = 1; j <= n * 4 + 4; j++) {e[i][j] = min(e[i][j], e[i][k] + e[k][j]);}}}cout << "最短距离为:" << e[1][n * 4 + 1];return 0;
}

声明

此题思路来源于 洛谷 P1354

合工大 程序设计艺术 实验三 房间最短路径相关推荐

  1. 合工大 程序设计艺术 实验六 买票问题

    题目 电影院卖电影票,但是没有零钱找,票价一张 5 元,买票的人为 n 个持有 5 元,m 个持 有 10 元,求解出可能的买票序列的个数,使得电影院能够将票卖完. 解题思路 买票问题是卡特兰数的经典 ...

  2. 合工大 编译原理 实验三

    合工大 编译原理 实验三 LR(1) 分析法 本项目使用c++实现,利用Windows API制作了简易的UI界面. 具体功能如下: 支持查看文法,项目族,LR(1) 分析表,句子归约过程. 可使用包 ...

  3. 基于python的文件加密传输系统 毕业论文_20183411 李丞灏 2020-2021 《python程序设计》 实验三 加密传输文件 实验报告...

    20183411 李丞灏 2020-2021 <python程序设计> 实验三 加密传输文件 实验报告 课程:<Python程序设计> 班级: 1834 姓名: 李丞灏 学号: ...

  4. 20145302张薇《Java程序设计》实验三报告

    20145302张薇<Java程序设计>实验三:敏捷开发与XP实践 实验内容 使用git上传代码 使用git实现代码开发实践 实现代码的重载 使用git上传代码 git init git ...

  5. 20155310 《Java程序设计》实验三(敏捷开发与XP实践)实验报告

    20155310 <Java程序设计>实验三(敏捷开发与XP实践)实验报告 实验内容 1.XP基础 2.XP核心实践 3.相关工具 实验步骤 (一)敏捷开发与XP 1.敏捷开发 敏捷开发( ...

  6. 20165205 2017-2018-2 《Java程序设计》实验三 敏捷开发与XP实践

    20165205 2017-2018-2 <Java程序设计>实验三 敏捷开发与XP实践 20165205 2017-2018-2 <Java程序设计>实验三 敏捷开发与XP实 ...

  7. 2018-2019-2 20175227张雪莹《Java程序设计》实验三 《敏捷开发与XP实践》

    2018-2019-2 20175227张雪莹<Java程序设计> 实验三 <敏捷开发与XP实践> 实验报告封面 课程:Java程序设计 班级:1752班 姓名:张雪莹 学号: ...

  8. 20155314 2016-2017-2 《Java程序设计》实验三 敏捷开发与XP实践

    20155314 2016-2017-2 <Java程序设计>实验三 敏捷开发与XP实践 实验内容 XP基础 XP核心实践 相关工具 实验知识点总结 (一)敏捷开发与XP 软件工程:把系统 ...

  9. 20182326 2019-2020-1 《数据结构与面向对象程序设计》实验三报告

    20182326 2019-2020-1 <数据结构与面向对象程序设计>实验三报告 课程:<程序设计与数据结构> 班级: 1823 姓名: 刘颖洁 学号:20182326 实验 ...

最新文章

  1. 戳戳HackShield Ring0反調試
  2. 网站优化有什么值得注意的小细节吗?
  3. 6张脑图系统讲透python爬虫和数据分析、数据挖掘
  4. 案例 项目经理评分 c# 1613922661
  5. 中国未来的可能性思考- 系统化思维-公司培训
  6. 使用ldconfig命令将/usr/local/lib加入到默认库
  7. opencv检测相交点_OpenCV学习笔记(八) 边缘、线与圆的检测
  8. php 判断来源 微信客户端_常见WebShell客户端的流量特征及检测思路
  9. js-05--对象是什么、创建对象、对象使用、操作对象、遍历对象、内置对象、Math、任意范围随机数、日期对象、字符串对象
  10. Android 9.0 蓝牙配对流程
  11. sqrt方法复杂度探讨
  12. Bazel入门:编译C++项目
  13. Python3语言详解
  14. 从头开始学习->JVM(三):类加载器(上)
  15. mongoose 入门(四)使用aggregate 聚合管道、使用 populate 实现关联查询
  16. 蚂蚁聚宝虫洞,数据传输的桥梁
  17. 思科模拟器服务器http配置文件,在思科模拟器上通过TFTP拷贝路由器的配置文件到本地...
  18. python——求解微分方程
  19. java中trim_JAVA中trim()函数使用方法
  20. 用成员函数和友元函数重载运算符

热门文章

  1. 《静夜思》赏析-(李白明月姑娘之二)
  2. python编辑elif显示错误_Python if / elif语法错误…为什么
  3. 【2022年 华为上海无线部门实习 逻辑岗位 面试复盘】
  4. SIGINT、SIGKILL、SIGTERM 信号区别
  5. 开源EDR(OSSEC)基础篇- 01 -设计定位与能力输出
  6. .Net Core基础之读取配置文件
  7. 阿里云盘配合RaiDrive 实现挂载本地盘
  8. Be Agile VS Do Agile 之 1
  9. AWS入门指南之一:怎样创建免费的AWS账号
  10. mysql中 where in 用法详解