POJ-1556 The Doors 线段相交+最短路

题意:在一个矩形平面内,有若干道墙,现求从左部某一点到右部某一点的最短路径。

解法:有一个事实是线路一定是从门两边的点上通过的,不可能出现从中间穿过的可能。因此我们就枚举两两点之间是否可达,这里就要使用到线段相交的判定。构好图之后就是一个spfa搞定。

代码如下:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;int N;struct Wall {double x, a, b, c, d;
}w[20];struct Point {double x, y;
}e[105];
int idx;struct Line {Point a, b;Line(Point x, Point y) {a = x, b = y;}friend bool cross(const Line &, const Line &);
};double G[105][105];bool cross(const Line & Line1, const Line & Line2) {double Xa1 = Line1.a.x;double Ya1 = Line1.a.y;double Xa2 = Line1.b.x;double Ya2 = Line1.b.y;double Xb1 = Line2.a.x;double Yb1 = Line2.a.y;double Xb2 = Line2.b.x;double Yb2 = Line2.b.y;if(((Xa2-Xa1)*(Yb1-Ya1)-(Xb1-Xa1)*(Ya2-Ya1))*((Xa2-Xa1)*(Yb2-Ya1)-(Xb2-Xa1)*(Ya2-Ya1))>0)return false;if(((Xb2-Xb1)*(Ya1-Yb1)-(Xa1-Xb1)*(Yb2-Yb1))*((Xb2-Xb1)*(Ya2-Yb1)-(Xa2-Xb1)*(Yb2-Yb1))>0)return false;return true;
}void insert(double x, double y) {e[idx].x = x, e[idx].y = y;++idx;
}bool legal(int x, int y) {Line line = Line(e[x], e[y]);int l = (x-1)/4, r = (y-1)/4; // 分别计算出这些点属于哪一面墙,再枚举中间的墙if (x == 0) l = -1;    // x==0时需特殊处理for (int i = l+1; i < r; ++i) { // 计算是否被墙挡住if (!cross(line, Line(e[i*4+1], e[i*4+2])) // 如果不从中间墙的某道门穿过的话 && !cross(line, Line(e[i*4+3], e[i*4+4]))) {return false;}}return true;
}double dist(const Point & a, const Point & b) {return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
}void build() {for (int i = 0; i < idx; ++i) {for (int j = i + 1; j < idx; ++j) { // 枚举所有的两两组合 if (legal(i, j)) {G[i][j] = dist(e[i], e[j]);}}}
}#include <queue>
bool vis[105];
double dis[105];
void spfa() {memset(vis, 0, sizeof (vis));for (int i = 0; i < idx; ++i) {dis[i] = 10000000;    }dis[0] = 0;queue<int>q;q.push(0);vis[0] = true;while (!q.empty()) {int v = q.front();q.pop();
vis[v] = false;
for (int i = v+1; i < idx; ++i) {if (G[v][i] != 10000000 && dis[i] > dis[v] + G[v][i]) {dis[i] = dis[v] + G[v][i];if (!vis[i]) {vis[i] = true; q.push(i);}}} } }int main() {while (scanf("%d", &N), N != -1) {for (int i = 0; i < 105; ++i) {for (int j = 0; j < 105; ++j) {G[i][j] = 10000000; }}idx = 0;insert(0.0, 5.0);for (int i = 0; i < N; ++i) {scanf("%lf %lf %lf %lf %lf", &w[i].x, &w[i].a, &w[i].b, &w[i].c, &w[i].d);insert(w[i].x, w[i].a), insert(w[i].x, w[i].b);insert(w[i].x, w[i].c), insert(w[i].x, w[i].d);// 读取所有的墙,并且添加四个点 }insert(10, 5);build();spfa();printf("%.2f\n", dis[idx-1]);}return 0; }

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/266348.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【matlab】Matlab三维绘图指南

Matlab是一种强大的数学计算和可视化工具,而三维绘图是其功能之一。通过Matlab的三维绘图功能,我们可以创建精美、直观的三维图形,展示和分析复杂的数据。本文将为您提供一份简明的Matlab三维绘图指南,帮助您快速上手并创建出令人印象深刻的三维图形。 准备数据在开始绘制三…

laravel mysql视图,在 Laravel 视图文件中引入 bootstrap

如何在 Laravel 视图文件中引入 bootstrap&#xff1f;对于从来没有接触过 PHP 开发框架的菜鸟来说&#xff0c;这确实是个问题。在我们这些菜鸟传统的认知里&#xff0c;要在一个 html/php 文件里引入一个外部 css 文件&#xff0c;link 标签 href 属性的值&#xff0c;应该填…

全国计算机等级考试题库二级C操作题100套(第58套)

第58套&#xff1a; 给定程序中&#xff0c;函数fun的功能是&#xff1a;把形参s所指字符串中最右边的n个字符复制 到形参t所指字符数组中&#xff0c;形成一个新串。若s所指字符串的长度小于n&#xff0c;则将整个 字符串复制到形参t所指字符数组中。例如&#xff0c;形参s所…

linux mysql 修改root密码_Mac下重置mysql的root密码

php中文网最新课程每日17点准时技术干货分享我的mysql版本 MYSQL V5.7.9&#xff0c;旧版本请使用&#xff1a;UPDATE mysql.user SET PasswordPASSWORD(新密码) WHERE Userroot;Mac OS X - 重置 MySQL Root密码密码太多记不住&#xff1f;&#xff1f;你是否忘记了Mac OS 的My…

DHCP option 150与option 66的区别

转载于:https://blog.51cto.com/jaymimijay/1150777

全国计算机等级考试题库二级C操作题100套(第59套)

第59套&#xff1a; 给定程序中&#xff0c;函数fun的功能是&#xff1a;在34的矩阵中找出在行上最大、在列上最小的那个元素&#xff0c;若没有符合条件的元素则输出相应信息。 例如&#xff0c;有下列矩阵&#xff1a; 1 2 13 4 7 8 10 6 3 5 9 7 程序执行结果为&#xff1a…

python期末知识点_史上最全的Python知识点整理之基本语法

一、程序的格式框架 1.缩进 缩进是指每行语句前的空白区域&#xff0c;用来表示Python程序间的包含和层次关系。 一般语句不需要缩进&#xff0c;顶行书写且不留空白。 当表示分支、循环、函数、类等含义&#xff0c;在if&#xff0c;while&#xff0c;for&#xff0c;def&…

升降压斩波电路matlab,升降压直流斩波电路及matlab仿真.doc

升降压直流斩波电路及matlab仿真目录绪论………………………………………………………………….3降压斩波电路…………………………………………………..6直流斩波电路工作原理及输出输入关系……………12D c&#xff0f;D C变换器的设计…………………………………………18测试…

AIX下RAC巡检文档 (上)

一、操作系统查看1 1> 查看操作系统&#xff08;AIX 文件系统是否合理&#xff09; 方式: " df -m ,查看所有的文件系统大小 是否>2G" 结果类似下面: $df -m Filesystem MB blocks Free %Used Iused %Iused Mounted on /dev/hd4 …

php网页多个倒计时,怎么实现一个页面有多个倒计时同时进行

后台返回时间&#xff0c;一个页面中有多个表格每个表格中有一行用来显示后台给的时间&#xff0c;比如说后台给一号表格10分钟的倒计时时间&#xff0c;给2号表格15分钟的倒计时时间&#xff0c;那我要怎么做才能使得这两个倒计时都能进行&#xff1f;&#xff1f;我自己模拟了…

全国计算机等级考试题库二级C操作题100套(第60套)

第60套&#xff1a; 给定程序中&#xff0c;函数fun的功能是:将形参指针所指结构体数组中的三个元素按num成员进行升序排列。 请在程序的下划线处填入正确的内容并把下划线删除&#xff0c;使程序得出正确的结果。 注意&#xff1a;源程序存放在考生文件夹下的BLANK1.C中。 不…

opencv在python环境下的安装_python环境下安装opencv库的方法

注意&#xff1a;安装opencv以前须要先安装numpy&#xff0c;matplotlib等python 1、安装方法windows 方法1、在线安装函数 1.先安装opencv-python测试 pip install opencv-python --userspa个人python版本是3.6.8&#xff0c;能够看到opencv安装的默认版本是 opencv_python-4.…

接口的创建及使用

接口是全局变量和公共的抽象方法集合。它也是一种定义数据类型的方式&#xff0c;与类相比 相同之处&#xff1a;都是成员变量和成员方法也可以形成继承关系。 不同之处&#xff1a;接口中的属性都是常量&#xff08;final&#xff09;接口中的方法是抽象方法&#xff08;没有方…

博客的未来仍然光明

博客的未来仍然光明 博客&#xff0c;能够实现欲望表达&#xff0c;自我实现&#xff0c;同时又能阶段性的形成自己的著作&#xff0c;取得一定的收益。目前在博客圈里不缺好作者&#xff0c;不缺平台&#xff0c;不缺读者&#xff0c;缺氛围。我们更需要的是&#xff0c;一个帮…

movielens推荐系统_基于内容推荐(二)

A content-based movie recommender system using MovieLens tags &#xff08;用标签构建一个简单的电影推荐系统&#xff09;现在有很多电影。如果没有某种推荐系统&#xff0c;您会担心&#xff0c;随着时间的流逝&#xff0c;用户可能会被他们不关心的电影所淹没。因此&…

全国计算机等级考试题库二级C操作题100套(第61套)

第61套&#xff1a; 函数fun的功能是进行字母转换。若形参ch中是小写英文字母,则转换成对应的大写英文字母&#xff1b;若ch中是大写英文字母&#xff0c;则转换成对应的小写英文字母&#xff1b;若是其它字符则保持不变&#xff1b;并将转换后的结果作为函数值返回。 请在程序…

phpcms毛遂

1.showmessage()showmessage(L(operation_success),?mlink&clink&aedit,, edit);edit>关闭对象showmessage(L(operation_failure));showmessage(L(operation_false),HTTP_REFERER);2.formValidator3.update()$dataarray(nickname>$_POST[nickname],contact>$…

android java 指针,opencv android:向我的代码中添加cascade分类器后出现空指针异常

我在casecadeclassifier.java类中收到空指针异常在这里:Mat objects_mat objects;detectMultiScale_4(nativeObj, image.nativeObj, objects_mat.nativeObj, scaleFactor);这是我的日志:02-11 20:53:15.209 10968-10968/? E/SystemUpdate-ReflectUtils: getClass android.pro…

HALCON 1D Measure 算子初识

基本上1D Measure都是建立一个ROI(region of interest&#xff0c;感兴趣区域)&#xff0c;然后在感兴趣区域提取出边界的测量。常见的ROI有矩形ROI和圆环ROI。 下图为一个矩形ROI&#xff0c;中间的Profile Line为横截线&#xff0c;Center是行和列的坐标&#xff0c;Phi指定了…

python可视化界面编程 pycharm_pycharm开发一个简单界面和通用mvc模板(操作方法图解)...

文章首先使用pycharm的 PyQt5 Designer 做一个简单的界面&#xff0c;然后引入所谓的“mvc框架”。 一、设计登录界面 下面开始第一个话题&#xff0c;使用pycharm的 PyQt5 Designer 做一个简单的界面。 上一篇最后&#xff0c;在pycharm中配置了PyQt5 Designer 和 uic&#xf…