题目大意:求从(0,5)到(10,5)的最短距离,起点与终点之间有n堵墙,每个墙有2个门。

题目思路:判断两点间是否有墙(判断两点的连线是否与某一堵墙的线段相交),建立一个图,然后最短路求出就可以了。

#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<queue>
#define INF 0x3f3f3f3f
#define MAX 1005 double Map[MAX][MAX],dist[MAX];
int n,vis[MAX],G[MAX][MAX];//G储存点的序号
struct node
{
double x[],y[];
int len;
}point[MAX]; double Cross(double x1,double y1,double x2,double y2,double x3,double y3,double x4,double y4)//叉积
{
double a=(x2-x1)*(y3-y1)-(x3-x1)*(y2-y1);
double b=(x2-x1)*(y4-y1)-(x4-x1)*(y2-y1);
return a*b;
} int check(double x1,double y1,double x2,double y2,int pos1,int pos2)//判断两点的连线是否与某一段墙相交
{
for(int i=pos1+;i<pos2;i++)
{
if(Cross(x1,y1,x2,y2,point[i].x[],,point[i].x[],point[i].y[])<1e- && Cross(point[i].x[],,point[i].x[],point[i].y[],x1,y1,x2,y2)<1e-)
return ;
if(Cross(x1,y1,x2,y2,point[i].x[],point[i].y[],point[i].x[],point[i].y[])<1e- && Cross(point[i].x[],point[i].y[],point[i].x[],point[i].y[],x1,y1,x2,y2)<1e-)
return ;
if(Cross(x1,y1,x2,y2,point[i].x[],point[i].y[],point[i].x[],)<1e- && Cross(point[i].x[],point[i].y[],point[i].x[],,x1,y1,x2,y2)<1e-)
return ;
}
return ;
} double Dist(double x1,double y1,double x2,double y2)//求两点间距离
{
return sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2));
} double dij()//最短路
{
int k;
double minn;
memset(vis,,sizeof(vis));
for(int i=;i<=*n+;i++)
dist[i]=Map[][i];
dist[]=;
vis[]=;
for(int i=;i<*n+;i++)
{
minn=INF;
for(int j=;j<=*n+;j++)
{
if(minn>dist[j] && !vis[j])
{
k=j;
minn=dist[j];
}
}
vis[k]=;
for(int j=;j<=*n+;j++)
{
if(dist[j] > Map[k][j]+dist[k])
dist[j]=Map[k][j]+dist[k];
}
}
return dist[*n+];
} int main()
{
int cnt;
double x,y;
while(scanf("%d",&n),n!=-)
{
cnt=;
point[].len=;
point[n+].len=;
G[][]=;
point[].x[]=;
point[].y[]=;
point[n+].x[]=;
point[n+].y[]=;
G[n+][]=*n+;
for(int i=;i<MAX;i++)
for(int j=;j<MAX;j++)
Map[i][j]=INF;
for(int i=;i<=n;i++)
{
scanf("%lf",&x);
point[i].len=;
for(int j=;j<=;j++)
{
scanf("%lf",&y);
point[i].x[j]=x;
point[i].y[j]=y;
G[i][j]=++cnt;
}
}
for(int i=;i<=n;i++)
{
for(int j=;j<=point[i].len;j++)
{
x=point[i].x[j];
y=point[i].y[j];
for(int q=i+;q<=n+;q++)
{
for(int f=;f<=point[q].len;f++)
{
double x1=point[q].x[f];
double y1=point[q].y[f];
int op=check(x,y,x1,y1,i,q);
if(op)
{
int a=G[i][j];
int b=G[q][f];
Map[a][b]=Dist(x,y,x1,y1);
}
}
}
}
}
double ans=dij();
printf("%.2lf\n",ans);
}
return ;
}

POJ1556 The Doors 叉积+最短路的更多相关文章

  1. 2018.07.06 POJ1556 The Doors(最短路)

    The Doors Time Limit: 1000MS Memory Limit: 10000K Description You are to find the length of the shor ...

  2. poj1556 The Doors(叉积判断线段相交)

    题目链接:https://vjudge.net/problem/POJ-1556 题意:在一个矩形内,起点(0,5)和终点(10,5)是固定的,中间有n个道墙(n<=18),每道墙有两个門,求起 ...

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

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

  4. POJ 1556 The Doors(计算几何+最短路)

    这题就是,处理出没两个点.假设能够到达,就连一条边,推断可不能够到达,利用线段相交去推断就可以.最后求个最短路就可以 代码: #include <cstdio> #include < ...

  5. POJ1556 The Doors [线段相交 DP]

    The Doors Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 8334   Accepted: 3218 Descrip ...

  6. The Doors(几何+最短路,好题)

    The Doors http://poj.org/problem?id=1556 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions ...

  7. 【转】最短路&差分约束题集

    转自:http://blog.csdn.net/shahdza/article/details/7779273 最短路 [HDU] 1548 A strange lift基础最短路(或bfs)★254 ...

  8. 转载 - 最短路&差分约束题集

    出处:http://blog.csdn.net/shahdza/article/details/7779273 最短路 [HDU] 1548    A strange lift基础最短路(或bfs)★ ...

  9. 【kuangbin专题】计算几何基础

    1.poj2318 TOYS 传送:http://poj.org/problem?id=2318 题意:有m个点落在n+1个区域内.问落在每个区域的个数. 分析:二分查找落在哪个区域内.叉积判断点与线 ...

随机推荐

  1. php基础(三)超全局变量

    超全局变量 在 PHP 4.1.0 中引入,是在全部作用域中始终可用的内置变量. PHP 全局变量 - 超全局变量 PHP 中的许多预定义变量都是“超全局的”,这意味着它们在一个脚本的全部作用域中都可 ...

  2. CSS制作照片墙

    资料来源:慕课网(点击这里) 课程结束后有两个效果: 效果一:CSS制作照片墙(点击这里) 效果二:旋转出现文字效果(点击这里) 实现代码: <!DOCTYPE html> <htm ...

  3. spring容器启动的加载过程(二)

    第六步: public abstract class AbstractApplicationContext extends DefaultResourceLoader implements Confi ...

  4. IMAGE服务器软件配置

    NFS: vim /etc/exports /bak/www/www.xxxl.com/public/ 10.20.10.0/24(rw,sync,no_root_squash)/bak/www/ww ...

  5. laravel常用拓展库

    1.laravel-dompdf:pdf生成器 git地址:https://github.com/barryvdh/laravel-dompdf 2.

  6. Core Animation中的关键帧动画

    键帧动画就是在动画控制过程中开发者指定主要的动画状态,至于各个状态间动画如何进行则由系统自动运算补充(每两个关键帧之间系统形成的动画称为“补间动画”),这种动画的好处就是开发者不用逐个控制每个动画帧, ...

  7. HTML+CSS D09 定位

    1.定位 (1)相对定位 如果对一个元素进行相对定位,它将出现在它所在的位置上.然后,可以通过设置垂直或水平位置,让这个元素“相对于”它的起点进行移动. #box_relative {  positi ...

  8. JPA 系列教程12-复合主键-2个@Id+@IdClass

    复合主键 指多个主键联合形成一个主键组合 需求产生 比如航线一般是由出发地及目的地确定,如果要确定唯一的航线就可以用出发地和目的地一起来表示 ddl语句 同复合主键-2个@Id一样 Airline p ...

  9. UIKit继承结构和UIView.h文件详解

    @interface UIView : UIResponder<NSCoding, UIAppearance, UIAppearanceContainer, UIDynamicItem> ...

  10. SVG中image tag的高亮

    今天下午和晚上全部在实验室调试scs可视化,下午主要时间在调试字符云图的东西,不过感觉没有提升,还是不好看,囧~~ 把力道图中的线条给调整了,调细之后,好看了不少. 因为需要多个区域交互,也就是需要高 ...