POJThe Doors AND NYIST 有趣的问题

题目链接:

pid=227" target="_blank">Click Here~

题目分析:

给你横纵坐标分别表示门所在的位置。叫你求出从起点到终点的最短距离。

算法分析:

该题好像有多种解法,我仅仅说我做的。

我用的是几何+图论。

建模分析:

1、先推断两个点之间能否够连接。

2、推断两个点能否够链接的方法是用是否推断墙与这两点连成的线段是否相交。

3、假设没有相交则直接连接。

4、最后最短路求出结果就好了

    #include <iostream>
    #include <algorithm>
    #include <queue>
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    using namespace std;

    const double eps = 1e-8;
    const double INF = 9999999;
    const int MAXN = 200;
    struct Point{
        double x,y;
    }p[MAXN];
    struct Segment{
        Point A,B;
    }seg[MAXN];
    double graph[MAXN][MAXN];
    double Dist(const Point &a,const Point &b)
    {
        return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
    }
    int dblcmp(double x)
    {
        if(fabs(x)<eps)
            return 0;
        return x>0?

1:-1;
    }
    double det(double x1,double y1,double x2,double y2)
    {
        return x1*y2-x2*y1;
    }
    double cross(const Point &a,const Point &b,const Point &c)
    {
        return det(a.x-c.x,a.y-c.y,b.x-c.x,b.y-c.y);
    }
    bool segcross(const Point &a,const Point &b,const Segment &s)
    {
        int d1,d2,d3,d4;
        d1 = dblcmp(cross(s.A,s.B,a));
        d2 = dblcmp(cross(s.A,s.B,b));
        d3 = dblcmp(cross(a,b,s.A));
        d4 = dblcmp(cross(a,b,s.B));
        if((d1^d2)==-2&&(d3^d4)==-2)
            return true;
        return false;

    }
    bool Check(int i,int j,int k)
    {
          if(p[i].x!=p[j].x&&p[i].x!=seg[k].A.x&&p[j].x!=seg[k].A.x&&segcross(p[i],p[j],seg[k]))
            return true;
          return false;
    }
    double Spfa(int s,int e)
    {
        bool inq[MAXN];
        double d[MAXN];
        for(int i = 0;i <= e;++i){
            inq[i] = false;
            d[i] = INF;
        }
        d[s] = 0; inq[s] = true;

        queue<int> Q;
        Q.push(s);
        while(!Q.empty()){
            int u = Q.front();
            Q.pop();
            inq[u] = false;
            for(int i = 0;i <= e;++i){
               if(d[i] > d[u]+graph[u][i]){
                   d[i] = d[u] + graph[u][i];
                   if(!inq[i]){
                      inq[i] = true;
                      Q.push(i);
                   }
               }
            }
        }
        return d[e];
    }
    int main()
    {
        int n,t;
        while(scanf("%d",&n),n+1)
        {
            t = 4*n+1;
            p[0].x = 0; p[0].y = 5;
            p[t].x = 10; p[t].y = 5;
            double x,a,b,c,d;
            for(int i = 0;i < n;++i){
                scanf("%lf%lf%lf%lf%lf",&x,&a,&b,&c,&d);
                p[i*4+1].x = x; p[i*4+1].y = a;
                p[i*4+2].x = x; p[i*4+2].y = b;
                p[i*4+3].x = x; p[i*4+3].y = c;
                p[i*4+4].x = x; p[i*4+4].y = d;
                //把墙分成三个线段
                seg[i*3].A.x = x; seg[i*3].A.y = 0;
                seg[i*3].B.x = x; seg[i*3].B.y = a;
                seg[i*3+1].A.x = x; seg[i*3+1].A.y = b;
                seg[i*3+1].B.x = x; seg[i*3+1].B.y = c;
                seg[i*3+2].A.x = x; seg[i*3+2].A.y = d;
                seg[i*3+2].B.x = x; seg[i*3+2].B.y = 10;
            }
            for(int i = 0;i <= t;++i)
                for(int j = 0;j <= t;++j)
                   graph[i][j] = INF;
            for(int i = 0;i < t;++i){
                for(int j = i+1;j <= t;++j){
                    bool flag = true;
                    for(int k = 0;k < 3*n;++k){
                        if(Check(i,j,k)){
                            flag = false;
                            break;
                        }
                    }
                    if(flag){
                        graph[i][j] = Dist(p[i],p[j]);
                    }
                }
            }
            printf("%.2lf\n",Spfa(0,t));
        }
        return 0;
    }



版权声明:本文博客原创文章,博客,未经同意,不得转载。

时间: 2024-08-13 21:04:15

POJThe Doors AND NYIST 有趣的问题的相关文章

几个linux终端的有趣玩法

1.sl 还可以给别人搞恶作剧: alias ls=sl 这样别人使用 ls 列出目录和文件的时候,却出现一个小火车,那滋味一定很酸爽哈哈哈哈! 2. fortune 这个命令会随机输出有趣的话,比如名言或笑话.同样需要先安装. apt-get install fortune (for aptitude based system) yum install fortune (for yum based system) [email protected]:~$ fortune There is no

看到个有趣的方法批量下载rtf模板

一般想要批量下载rtf模板我们都是用fndload来实现或者 perl download.pl来实现,今天看到一个比较有趣的方法 Hi, Blob column 'template file data' below is just what you want, open it in PLSQL-DEVELOPER and save it as a rtf file or you can write programs that work with 'BLOB' objects to export

编程语言中那些有趣的命名

学习NodeJS的时候,一定会用到其包管理器npm.npm的字面意思是node package manager,实际的含义也是这样,但是npm真正的英文名却是"npm is not an acronym",意思是"npm不是一个缩写",所以如果要问npm是什么单词的缩写,那么回答就是"'npm是不是一个缩写'的缩写". 这种计算机科学中的"饶舌"现象叫作递归缩写. 递归缩写(Recursive acronym)即递归首字缩写,

有趣的网页小部件笔记

在网页上加入一些简单的小部件就可以让网页变得很有趣,这里记录一下用过的比较有趣的小部件. 1. 访问次数统计 借助于amazingcounters可以统计网站的被访问次数,提供了很多的样式可以选择: 只需要将生成的html代码片段插入到要统计的网页中即可: <p style="align: center"> <a href="http://www.amazingcounters.com"> <img border="0&quo

(有趣)chrome不同浏览器版本对display:flex和溢出隐藏显示省略符号的bug

项目中碰到一个十分有趣的情形: 布局要求是这样:右边创建新订单是固定宽度80px,左侧是自适应宽度,溢出隐藏.如下图. 这里布局不用说肯定使用display:flex的.左侧flex:1;右侧width:80px:. 本来在我的机器上是各种ok的,可是交给后端的兄弟们后发现在他的机器上左侧并没有flex:1; 总是以一个固定的宽度杵在那里,破坏掉布局,后来一查看,原来是后端的chrome是最新版本, 而我的这台机器是旧版本,两个版本的chrome对display:flex的解析竟然不一样. 解决

10个有趣的Linux命令

  Linux当中有很多比较有趣的命令,可以动手看看,很简单的. 1.rev命令 一行接一行地颠倒所输入的字符串. 运行: $rev 如输入:shiyanlou shiyanlou rev.jpg 2.asciiview命令 1)先安装aview $sudo apt-get install aview 2)再安装imagemagick $sudo apt-get install imagemagick 3)使用asciiview $asciiview shiyanlou.png -driver 

关于java除法的一个有趣例子。

今天逛贴吧的时候偶然发现吧友的一个有趣例子. public class Demo{     public static void main(String[]args){         System.out.println(24/0);  //会抛byzero异常         System.out.println(24.0/0.0) //可以输出,输出为Infinity:     } } 目前对于第二句为什么不会报byzero异常也不知道.先做个标记.理解了再补充上.

有趣的数

有趣的数 问题描述 我们把一个数称为有趣的,当且仅当: 1. 它的数字只包含0, 1, 2, 3,且这四个数字都出现过至少一次. 2. 所有的0都出现在所有的1之前,而所有的2都出现在所有的3之前. 3. 最高位数字不为0. 因此,符合我们定义的最小的有趣的数是2013.除此以外,4位的有趣的数还有两个:2031和2301. 请计算恰好有n位的有趣的数的个数.由于答案可能非常大,只需要输出答案除以1000000007的余数. 输入格式 输入只有一行,包括恰好一个正整数n (4 ≤ n ≤ 100

编程为什么有趣?

编程是否有趣,在不同的时间点可能有不同的看法,像上学时成功解决一道线上的编程题感觉很有趣.但是要在工作里天天写的是sql 写页面 写UI 搭环境 看日志 可能会感觉很无趣.新霸哥觉得编码是一个很无聊的一个过程,但是却是实践想法的一个过程. 创建事物的纯粹快乐 一种想法或者是一个设计在程序员的编程设计下,经过自己的设计能够让一个事物有无到有的展现在我们眼前.如同小孩在玩剪纸一样,通过自己的设计能够展现给你一个完整的设计结果,这种快乐不是一般人能体会到的. 开发出来的东西有价值 开发者开发出来的东西