思路:暴力判断每个点连成的线段是否被墙挡住,构建图。求最短路。

思路很简单,但是实现比较复杂,模版一定要可靠。

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<iostream>
using namespace std;
,M=N*N;
const double INF=0x3f3f3f3f;
;
int sgn(double x){
    ;
    )    ;
    ;
}
struct point{
    double x,y;
    point(){}
    point(double x_,double y_){
        x=x_,y=y_;
    }
    point operator -(const point &b)const{
        return point(x-b.x,y-b.y);
    }
    double operator *(const point &b)const{
        return x*b.x+y*b.y;
    }
    double operator ^(const point &b)const{
        return x*b.y-y*b.x;
    }
}po[N];
struct line{
    point s,e;
    line(){}
    line(point s_,point e_){
        s=s_,e=e_;
    }
}li[N];
double dis(point a,point b){//距离
    return sqrt((b-a)*(b-a));
}
double cal(point p0,point p1,point p2){//叉积
    return (p1-p0)^(p2-p0);
}
int xj(line a,line b){//判断线段相交
    point A=a.s,B=a.e,C=b.s,D=b.e;
    return
    max(A.x,B.x)>=min(C.x,D.x) &&
    max(C.x,D.x)>=min(A.x,B.x) &&
    max(A.y,B.y)>=min(C.y,D.y) &&
    max(C.y,D.y)>=min(A.y,B.y) &&
    sgn(cal(A,C,D))*sgn(cal(B,C,D))< &&
    sgn(cal(C,A,B))*sgn(cal(D,A,B))<=;
}
//最短路部分
struct node{
    int v,next;
    double w;
}e[M];
int p[N],head[N],cnt,q[M],l,r,n;
double d[N];
void add(int u,int v,double w){
    e[cnt].v=v,e[cnt].w=w;
    e[cnt].next=head[u],head[u]=cnt++;
}
void spfa(){
    l=r=;
    memset(p,,sizeof(p));
    ;i<=n;i++)    d[i]=INF;
    q[++r]=;d[]=;
    int u,v,i;
    double w;
    while(l<r){
        p[u=q[++l]]=;
        ;i=e[i].next){
            w=e[i].w,v=e[i].v;
            if(d[v]>d[u]+w){
                d[v]=d[u]+w;
                if(!p[v]){
                    q[++r]=v;
                    p[v]=;
                }
            }
        }
    }
    printf("%.2f\n",d[n]);
}

int main(){
    int t,i,j,k,js;
    double x,y;
    ){
        cnt=js=n=;po[]=point(,);
        memset(head,-,sizeof(head));
        //¹¹½¨µãºÍÏß
        while(t--){
            scanf("%lf",&x);
            ;i<=;i++){
                scanf("%lf",&y);
                po[++n]=point(x,y);
                )        li[++js]=line(point(x,),po[n]);
                )    li[++js]=line(po[n],point(x,))    ;
                )    li[++js]=line(po[n-],po[n]);
            }
        }
        po[++n]=point(,);
        //½¨Í¼
        ;i<=n;i++){
            ;j<=n;j++){
                ;
                ;k<=js;k++){
                    if(xj(li[k],line(po[i],po[j]))){
                        f=;
                        break;
                    }
                }
                if(!f){
                    double tmp=dis(po[i],po[j]);
                    add(i,j,tmp);
                    add(j,i,tmp);
                }
            }
        }
        spfa();
    }
    ;
}
 

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

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

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

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

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

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

    The Doors Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 5210   Accepted: 2124 Descrip ...

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

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

  5. poj 1556 zoj1721 BellmanFord 最短路+推断直线相交

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

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

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

  7. ●POJ 1556 The Doors(简单计算几何+最短路)

    ●赘述题目 10*10的房间内,有竖着的一些墙(不超过18个).问从点(0,5)到(10,5)的最短路. 按照输入样例,输入的连续5个数,x,y1,y2,y3,y4,表示(x,0--y1),(x,y2 ...

  8. 【POJ 2653】Pick-up sticks 判断线段相交

    一定要注意位运算的优先级!!!我被这个卡了好久 判断线段相交模板题. 叉积,点积,规范相交,非规范相交的简单模板 用了“链表”优化之后还是$O(n^2)$的暴力,可是为什么能过$10^5$的数据? # ...

  9. POJ 1039 Pipe(直线和线段相交判断,求交点)

    Pipe Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 8280   Accepted: 2483 Description ...

随机推荐

  1. Android动态加载框架汇总

    几种动态加载的比较 1.Tinker 用途:热修复 GitHub地址:https://github.com/Tencent/tinker/ 使用:http://www.jianshu.com/p/f6 ...

  2. 初学Redis(1)——认识Redis

    Redis官网对Redis的定义是:“Redis is an open source, BSD licensed, advanced key-value cache and store”,可以看出,R ...

  3. js中top、clientTop、scrollTop、offsetTop的区别 文字详细说明版【转】

    之前在修改IE6下的一个显示bug时,查到过这些,贴这备忘,后面给出了详细说明,以前的版本,没仔细的说明,特希望大家也收藏下.   网页可见区域宽: document.body.clientWidth ...

  4. 查看regulator的信息

    例如,查看ldo6 /sys/devices/soc.0/qcom,rpm-smd.35/rpm-regulator-ldoa6.85/regulator-l6.110/regulator/regul ...

  5. [翻译]docker生态圈Mindmap

    Docker是一个开源的Linux容器,其被业界所接受,很快成为了一个产业标准.Docker可以减少应用程序启动 时候的大量资源的筹备.docker很快的成为了新兴的应用程序容器标准.现在有很多项目正 ...

  6. KlayGE 4.4中渲染的改进(五):OpenGL 4.4和OpenGLES 3

    转载请注明出处为KlayGE游戏引擎,本文的永久链接为http://www.klayge.org/?p=2796 上一篇我们提到了SSSSS,作为本系列的最后一篇,本文将介绍KlayGE 4.4的Op ...

  7. 修改文档框架:word-多级列表与标题样式相结合

    转自:http://blog.sina.com.cn/s/blog_6721f25c0100nuf0.html 设置标题的时候希望出现多标题并且自动编号的标题,如下1.     XXXXXXXXXXX ...

  8. 使用git管理代码的心得

    一.简易使用流程 首先下载安装git,点击Git Bash进入编辑界面,之后如下图进入目录并通过命令 git init 把这个目录变成git可以管理的仓库 接下来使用git add .命令将所有文件添 ...

  9. unity替换mesh测试

    直接替换SkinnedMeshRender的Mesh,实现所谓断肢效果(不过最近发现,绑定多mesh似乎更好实现这样的效果.有时间准备写一篇): 只要不改变两个Mesh原始文件的层级,就不会出现权重的 ...

  10. JavaScript实现冒泡排序

    思想:从第一个元素开始,对数组中两两相邻的元素比较,将值较小的元素放在前面,值较大的元素放在后面,一轮比较完毕,一个最大的数沉底成为数组中的最后一个元素,一些较小的数如同气泡一样上浮一个位置.n个数, ...