The Doors--poj1556(最短路+判断点与线段的关系)

http://poj.org/problem?id=1556

题目大意:从(0,5)走到(10,5)走的最短距离是多少

中间有最多18个隔着的墙  每个墙都有两个门  你只能从门通过

我的思路是  只要这两个点把能过的   就把他们的距离算出来  最后用迪杰斯塔拉算法求最短路就行了

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<ctype.h>
#include<math.h>
#include<algorithm>
#include<iostream>

using namespace std;
#define N 200
const double ESP = 1e-8;
#define INF 0xffffffff
int vis[N];
double dis[N];
struct node
{
    double x,y;
    int c;
    node(double x=0,double y=0,int c=0):x(x),y(y),c(c){}
}p[N];
node a[N][5];

double G[N][N];

double dij(int s,int e)
{
    memset(vis,0,sizeof(vis));
    for(int i=0;i<e;i++)
    {
        dis[i]=G[s][i];
    }
    for(int i=0;i<e;i++)
    {
        double Min=INF;
        int dist;
        for(int j=0;j<e;j++)
        {
            if(!vis[j] && Min>dis[j])
            {
                Min=dis[j];
                dist=j;
            }
        }
        vis[dist]=1;
        for(int j=0;j<e;j++)
        {
            if(!vis[j])
                dis[j]=min(dis[j],dis[dist]+G[dist][j]);
        }
    }
    return dis[e-1];
}

int main()
{
    int n;
    double k[N];
    while(scanf("%d",&n),n!=-1)
    {
        p[0]=node(0,5,0);
        int b=1;
        for(int i=1;i<=n;i++)
        {
            scanf("%lf",&k[i]);
            scanf("%lf %lf %lf %lf",&a[i][1].x,&a[i][1].y,&a[i][2].x,&a[i][2].y);
            p[b++]=node(k[i],a[i][1].x,i);
            p[b++]=node(k[i],a[i][1].y,i);
            p[b++]=node(k[i],a[i][2].x,i);
            p[b++]=node(k[i],a[i][2].y,i);
        }
        p[b++]=node(10,5,n+1);
        for(int i=0;i<b;i++)
        {
            for(int j=0;j<b;j++)
            {
                G[i][j]=INF;
            }
            dis[i]=INF;
        }
        for(int i=0;i<b;i++)
        {
            for(int j=i+1;j<b;j++)
            {
                if(p[i].c == p[j].c)
                    continue;
                int flag=0;
                for(int l=p[j].c-1; l>p[i].c; l--)
                {
                    double y=(k[l]-p[i].x)*(p[j].y-p[i].y)/(p[j].x-p[i].x)+p[i].y;
                    if(a[l][1].x-y>ESP || (a[l][1].y-y<ESP && a[l][2].x-y>ESP) || (a[l][2].y-y<ESP))
                    {
                        flag=1;
                        break;
                    }
                }
                if(flag==0)
                {
                    G[i][j]=sqrt((p[j].x-p[i].x)*(p[j].x-p[i].x)+(p[j].y-p[i].y)*(p[j].y-p[i].y));
                }
            }
        }
        double  aa=dij(0,b);
        printf("%.2f\n",aa);
    }
    return 0;
}
时间: 2024-10-14 19:45:49

The Doors--poj1556(最短路+判断点与线段的关系)的相关文章

poj 1556 zoj1721 BellmanFord 最短路+判断直线相交

http://poj.org/problem?id=1556 The Doors Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 6120   Accepted: 2455 Description You are to find the length of the shortest path through a chamber containing obstructing walls. The chamber will a

Poj 1556 The Doors 计算几何+最短路

其实本题非常的无脑,无脑拍完1A,写到blog里只因为TM无脑拍也拍了很久啊= = #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <climits> #include <string> #include <iostream> #include <map> #include <cstdl

hdu 4885 TIANKENG’s travel (最短路+判断三点共线)

TIANKENG's travel Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 408    Accepted Submission(s): 100 Problem Description TIANKENG has get a driving license and one day he is so lucky to find a

Java判断类和实例的关系

?? 通常我们使用instanceOf关键字来判断一个对象是否是类的实例,最近博主看到isInstance关键字,不解与instanceOf的区别,故度娘了一下,顺便涨了一下姿势. ?? Java中判断类和实例的关系有3个关键字:instanceof, isInstance以及isAssignableFrom. instanceof:用来判断对象是否是类的实例 isInstance:用来判断对象是否属于某个类型的实例 isAssignableFrom:用来判断类型间是否存在派生关系 ??看完上面

判断两个线段是否相交

我们的问题是这样的:给定一条线段的起点为$A_1$.终点为$A_2$,另一条线段的起点为$B_1$.终点为$B_2$,问线段$A_1A_2$和线段$B_1B_2$是否相交? 我们首先解释一下,两条线段相交的概念是指,存在一个点,这个点同时在两条线段上. 方法一(解方程法): 容易知道,线段$A_1A_2$上的点的集合为$A = A_1 * (1 - r_1) + A_2 * r_1$,其中$r_1 \in [0, 1]$:同理,线段$B_1B_2$上的点的集合为$B = B_1 * (1 - r

POJ 1584 A Round Peg in a Ground Hole 判断凸多边形 点到线段距离 点在多边形内

首先判断是不是凸多边形 然后判断圆是否在凸多边形内 kuangbin的板子,但是有些地方不明白. 判断多边形不是凸多边形后,为什么用判断点是否在凸多边形内的模板交WA了,而用判断点是否在任意多边形内的模板A了 而且判断点是否在任意多边形的注释,返回值为什么又说是凸多边形~~~ POJ 1584 A Round Peg in a Ground Hole(判断凸多边形,点到线段距离,点在多边形内) #include <iostream> #include <cstdio> #inclu

判断Type类的继承关系

bool IsInstanceOfType(object); //判断对象是否是指定类型 //类型可以是父类,接口 //用法:父类.IsInstanceOfType(子类对象) bool IsAssignableFrom(Type) //判断两个类型的关系 //类型可以是父类,接口 //用法:父类.IsAssignableFrom(子类) bool IsSubClassOf(Type) //判断两个类型的关系 //类型不可以是接口 //用法:子类.IsSubClassOf(父类)

POJ 3304 Segments(判断直线与线段是否相交)

http://poj.org/problem?id=3304 等价于是否存在一条直线穿过所有线段 判断直线与线段是否相交: 首先用两点p1,p2确定了一条直线 在用p1,p2分别与计算线段两个端点计算叉乘即可 ,叉乘之积>0就说明线段两端点在直线的同侧,也就是直线不经过此线段 注意顺序不要搞反了 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #incl

窗口滚动时,判断元素与视野的关系-js代码

思路解析: 通过判断以下三者与0的关系,来判断元素与视野的关系: 元素顶部距离窗口顶部的距离:t = elem.offset().top - $(window).scrollTop(); 元素底部距离窗口底部的距离:b = h - ( t + elem.height() ); 窗口的高度:h = $(window).height(); 可以列出以下情况: 根据这些情况就可以判断元素与视野的关系. 源码如下: // 判断元素和视野的关系 function setCheckInview(elem,