题目链接:

https://vjudge.net/problem/POJ-1556

题目大意:

给一个10*10的正方形房间中间用墙隔开每个墙上有两个门,给出门的两个端点坐标求从左边中点走到右边中点所需要的最短路程。

思路:

每扇门4个点,只要求出每两点之间的距离就可以建图求最短路径了,但是关键在于如何判断两点之间有没有直接路径,即两点之间呢能否直接连接,这就需要判断线段之间的相交问题,每堵墙有两个门,这堵墙被分成三部分,再判断两点之间有没有直接的路的时候,需要判断两点之间有没有和墙壁相交

比如上面的例子,第一堵墙分成了三部分,分别是:

(4,0)-(4,2)

(4,7)-(4,8)

(4,9)-(4,10)

判断两个点和墙的每一部分的是否相交时候,需要判断墙的两个端点是否在判断的那两个点的线段的同一侧。具体实现看代码,以后整理出计算几何入门必备模板。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<sstream>
using namespace std;
typedef long long ll;
const int maxn = 1e2 + ;
const int INF = 1e9 + ;
int T, n, m, cases;
struct Point
{
double x, y;
Point(double x, double y):x(x), y(y){}
Point(){}
};
struct Wall
{
double x, y[];
};
Point p[maxn];//存储每个点
Wall w[];//存储每堵墙,墙的x升序,y升序
double Map[maxn][maxn];//邻接矩阵
double Dis(Point a, Point b)//求两点之间的距离
{
return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
}
//判断点c位于直线ab上方还是下方
//矢量AB叉乘AC,大于0说明C在AB上方,小于0C在AB下方
//(b.x-a.x, b.y-a.y)叉乘(c.x-a.x, c.y-a.y)
double Judge_Cross(Point a, Point b, Point c)
{
return (b.x - a.x) * (c.y - a.y) - (c.x - a.x) * (b.y - a.y);
}
bool Isok(Point a, Point b)//判断点a, b是否有直接的路
{
if(a.x >= b.x)return false;
int i = , flag = true;
while(w[i].x <= a.x && i < n)i++;//排除x坐标比a小的墙
while(w[i].x < b.x && i < n)
{
if(Judge_Cross(a, b, Point(w[i].x, )) * Judge_Cross(a, b, Point(w[i].x, w[i].y[])) < )//点a,b被第一段阻挡
{
flag = false;
break;
}
if(Judge_Cross(a, b, Point(w[i].x, w[i].y[])) * Judge_Cross(a, b, Point(w[i].x, w[i].y[])) < )
{
flag = false;
break;
}
if(Judge_Cross(a, b, Point(w[i].x, w[i].y[])) * Judge_Cross(a, b, Point(w[i].x, )) < )
{
flag = false;
break;
}
i++;
}
return flag;
}
int tot;
double dijkstra(int u, int v)
{
int vis[maxn];
double d[maxn];
memset(vis, , sizeof(vis));
for(int i = ; i < tot; i++)d[i] = INF * 1.0;
d[u] = ;
for(int i = ; i < tot; i++)
{
int x;
double m = 1.0 * INF;
for(int i = ; i < tot; i++)if(!vis[i] && m > d[i])m = d[x = i];
vis[x] = ;
for(int i = ; i < tot; i++)d[i] = min(d[i], d[x] + Map[x][i]);
}
return d[v];
} int main()
{
while(cin >> n && (n != -))
{
p[] = Point(, );
tot = ;
for(int i = ; i < n; i++)
{
cin >> w[i].x;
for(int j = ; j < ; j++)
{
cin >> w[i].y[j];
p[tot++] = Point(w[i].x, w[i].y[j]);
}
}
p[tot++] = Point(, );
for(int i = ; i < tot; i++)//初始化邻接矩阵
{
for(int j = ; j < tot; j++)
Map[i][j] = 1.0 * INF;
}
//for(int i = 0; i < tot; i++)cout<<p[i].x<<" "<<p[i].y<<endl; for(int i = ; i < tot; i++)//建图
{
for(int j = i + ; j < tot; j++)
{
if(Isok(p[i], p[j]))//点i和点j有直接的路就建图
{
Map[i][j] = Dis(p[i], p[j]);
//cout<<i<<" "<<j<<" "<<Map[i][j]<<endl;
}
}
}
printf("%.2f\n", dijkstra(, tot - ));
}
return ;
}

POJ-1556 The Doors---线段相交+最短路的更多相关文章

  1. POJ 1556 - The Doors 线段相交不含端点

    POJ 1556 - The Doors题意:    在 10x10 的空间里有很多垂直的墙,不能穿墙,问你从(0,5) 到 (10,5)的最短距离是多少.    分析:        要么直达,要么 ...

  2. POJ 1556 The Doors(线段交+最短路)

    #include <iostream> #include <stdio.h> #include <string.h> #include <algorithm& ...

  3. POJ 1556 计算几何 判断线段相交 最短路

    题意: 在一个左下角坐标为(0,0),右上角坐标为(10,10)的矩形内,起点为(0,5),终点为(10,5),中间会有许多扇垂直于x轴的门,求从起点到终点在能走的情况下的最短距离. 分析: 既然是求 ...

  4. POJ 1556 The Doors 线段交 dijkstra

    LINK 题意:在$10*10$的几何平面内,给出n条垂直x轴的线,且在线上开了两个口,起点为$(0, 5)$,终点为$(10, 5)$,问起点到终点不与其他线段相交的情况下的最小距离. 思路:将每个 ...

  5. POJ 1556 The Doors 线段判交+Dijkstra

    The Doors Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 6734   Accepted: 2670 Descrip ...

  6. POJ 2556 (判断线段相交 + 最短路)

    题目: 传送门 题意:在一个左小角坐标为(0, 0),右上角坐标为(10, 10)的房间里,有 n 堵墙,每堵墙都有两个门.每堵墙的输入方式为 x, y1, y2, y3, y4,x 是墙的横坐标,第 ...

  7. POJ 1556 The Doors --几何,最短路

    题意: 给一个正方形,从左边界的中点走到右边界的中点,中间有一些墙,问最短的距离是多少. 解法: 将起点,终点和所有墙的接触到空地的点存下来,然后两两之间如果没有线段(墙)阻隔,就建边,最后跑一个最短 ...

  8. POJ_1556_The Doors_判断线段相交+最短路

    POJ_1556_The Doors_判断线段相交+最短路 Description You are to find the length of the shortest path through a ...

  9. POJ 1556 The Doors【最短路+线段相交】

    思路:暴力判断每个点连成的线段是否被墙挡住,构建图.求最短路. 思路很简单,但是实现比较复杂,模版一定要可靠. #include<stdio.h> #include<string.h ...

  10. 简单几何(线段相交+最短路) POJ 1556 The Doors

    题目传送门 题意:从(0, 5)走到(10, 5),中间有一些门,走的路是直线,问最短的距离 分析:关键是建图,可以保存所有的点,两点连通的条件是线段和中间的线段都不相交,建立有向图,然后用Dijks ...

随机推荐

  1. Eclipse项目出现红色叹号的解决办法

    以前的项目今天打开突然出现了红色的叹号,对于强迫症的患者简直忍不了,出现红色叹号的原因都是jar包出现问题导致的,如果是代码错误早就是一个大红叉了- 打开项目就可以发现,找不到哪里出问题了,代码和js ...

  2. JQ 判断 浏览器打开的设备类型

    <script> $(document).ready(function(){ var ua = navigator.userAgent; var ipad = ua.match(/(iPa ...

  3. Dijkstra算法 Java实现

    public class Dijkstra { private static int N = 1000; private static int[][] Graph = { { 0, 1, 5, N, ...

  4. 将 Shiro 作为应用的权限基础 四:shiro的配置说明

    Apache Shiro的配置主要分为四部分: SecurityManager的配置 URL过滤器的配置 静态用户配置 静态角色配置 其中,由于用户.角色一般由后台进行操作的动态数据,比如通过@Req ...

  5. 启动tomcat时jmx port被占用

    一.问题描述 今天一来公司,在IntelliJ IDEA 中启动Tomcat服务器时就出现了如下图所示的错误: 错误: 代理抛出异常错误: java.rmi.server.ExportExceptio ...

  6. JavaWeb学习笔记三 Servlet

    Servlet 是运行在服务端的Java小程序,是sun公司提供一套规范(接口),用来处理客户端请求.响应给浏览器的动态资源.但servlet的实质就是java代码,通过java的API,动态的向客户 ...

  7. Django--基本篇:项目结构与设计模式(MVC)

    Django在项目开发中有着结构清晰.层次明显.容易编写理解查阅demo的优点,那么我们来个小案例具体看看.    一.项目结构简析: 我们按照上一篇中的开发流程步骤创建一个新项目myblog,项目下 ...

  8. ES5和ES6两个值的比较

    ES5比较两个值是否相等 1)相等运算符 (==):比较两个数值是否相等,自动转换类型后再进行比较 2)全等运算符(===):比较两个比较值的数值和类型是否相等 ES5的特殊: ES6提出" ...

  9. 使用IDEA配置Maven + SpringMVC + Mybatis 【一步一步踩坑详细配置完成】

    PS:初学,想使用Maven配置一个SpringMVC的开发环境,照着网上的各种图文解说,配置了好久都没成功,有些写的不够详细,有些只有写一半,走了不少弯弯绕绕,踩了不少的坑,此文将正确配置成功的步骤 ...

  10. Access数据库跨库查询及记录集区分

    医疗设备软件一般都是单机软件,如果是Windows平台,常会选择Access数据库存储结构化数据,因为他轻量,便于部署.然而随着医疗信息化的发展,医生希望对多台单机设备的数据进行管理,采用网络数据库当 ...