题目大意:求从(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. (sql占位符)Remember that ordinal parameters are 1-based!

    第一次出现是 将第一个问号(?)的位置设为1了,其实是从0开始的. 第二次出现是 sql中的 问号 写成了 中文输入法下的问号,这个太难发现了,搞了半天才发现.然后改成英式问号就可以了. 每天进步一点 ...

  2. Linux入门(六)ubuntu下vim编辑器安装与使用

    原文链接:http://jingyan.baidu.com/article/219f4bf7d03187de452d3862.html 一.安装 vim 控制台版本的vim随ubuntu一起发行,因此 ...

  3. a标签href跳转---传值---禁止单引号

    禁止加单引号1  href传参的值  (&t_type='航班') 错误 <a href="check_apply?applyid=<?=$applyid?>&am ...

  4. ConcurrentHashMap完全解析(jdk6/7,8)

    并发编程实践中,ConcurrentHashMap是一个经常被使用的数据结构,相比于Hashtable以及Collections.synchronizedMap(),ConcurrentHashMap ...

  5. TortoiseGit - Gitblit使用简介

    1. 增加Repository http://192.168.242.128:10101 用admin admin登陆后,点击"版本库"--> 创建版本库 填写好 " ...

  6. UISlider 滑竿控件

    UISlider *slider = [[UISlider alloc] initWithFrame:CGRectMake:(100, 100, 200, 25);  //创建一个滑竿对象 slide ...

  7. Block使用中的一些要注意的地方

    本文主要是阐述一下Block中如何的使用外部变量以及block本身的内存管理. 先定义一个block变量,作为后续的例子中使用: typedef void(^BlockCC)(void); Block ...

  8. 【转载】将绿色版Tomcat服务添加到系统服务并设为开机运行

    转自: http://www.cnblogs.com/lan0725/archive/2009/11/04/1873859.html   运行cmd打开控制台,进入Tomat目录/bin文件夹,输入如 ...

  9. python 自动认证登录

    import urllib import base64 import urllib2 def auto_login(urllink,username,password): authstr = 'Bas ...

  10. ios电话拨打进行监听电话状态

    #import "ViewController.h" #import <CoreTelephony/CTCallCenter.h> #import <CoreTe ...