zoukankan      html  css  js  c++  java
  • 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
    ",aa);
        }
        return 0;
    }
  • 相关阅读:
    js中的原生Ajax和JQuery中的Ajax
    this的用法
    static的特性
    时政20180807
    java compiler没有1.8怎么办
    Description Resource Path Location Type Java compiler level does not match the version of the installed Java project facet Unknown Faceted Project Problem (Java Version Mismatch)
    分词器
    [数算]有一个工程甲、乙、丙单独做,分别要48天、72天、96天完成
    一点感想
    解析Excel文件 Apache POI框架使用
  • 原文地址:https://www.cnblogs.com/linliu/p/5431785.html
Copyright © 2011-2022 走看看