POJThe Doors AND NYIST 有趣的问题

题目链接: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; }



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

转载于:https://www.cnblogs.com/hrhguanli/p/4621169.html

POJThe Doors AND NYIST 有趣的问题相关推荐

  1. 辛普森一家,有趣的句子

    写在前面: 有趣的句子和翻译 你踏马怎么会在这儿         What in the blue heck are you doing here? 那真的是碉堡了         Now,that ...

  2. linux下的彩蛋和各种有趣的命令

    Linux screenfetch 一个显示系统信息和主题信息的命令 使用方法 输入screenfetch 效果图 Linuxlogo 显示linux版本logo图片及系统信息 使用方法 输入linu ...

  3. 力所能及的做些自己喜欢和有趣的事

    我们每个人都有自己喜欢做的事:在自己可控且力所能及的情况下,在闲时,按自己的意愿去做些自己喜欢和有趣的事,会感觉到这事很有意义.在忙时,要为理想和奋斗而忙:不浪费时间在无意义的事和人身上. 朋友要的是 ...

  4. 10玩rust_有趣的 Rust 类型系统: Trait

    也许你已经学习了标准库提供的 String 类型,这是一个 UTF-8 编码的可增长字符串.该类型的结构为: pub struct String {vec: Vec<u8>, } UTF- ...

  5. 有趣的计算机课的作文,有趣的电脑课作文500字

    昨天,我们上了一堂有趣的电脑课. 刚一踏进电脑室,我们便发现讲台旁放着一箱耳机,这些耳机上都缠绕着长长的耳机线.这节课我们会学习什么新知识呢?我怀着好奇心,坐在了座位上. 这时,上课铃响了.老师走到讲 ...

  6. 人工智能和机器学习领域有哪些有趣的开源项目

    人工智能和机器学习领域有哪些有趣的开源项目? 投递人 itwriter 发布于 2014-12-02 11:21 评论(0) 有20人阅读  原文链接  [收藏]  « 本文简要介绍了 10 款   ...

  7. C++拾趣——有趣的操作符重载

    操作符重载是C++语言中一个非常有用的特性.它可以让我们比较优雅的简化代码,从而更加方便的编写逻辑. 为什么要使用操作符重载 一种常见的用法是重载<<运算符,让标准输出可以输出自定义的类型 ...

  8. 简单有趣的matlab小程序_超实用有趣的五个小程序推荐

    大家好,我是小胖. 废话不多说,进入正题. 1.一周CP共读 有趣的灵魂总会相遇. 一个极简的社交小程序. 通过选择自己喜欢的一本书,匹配到那个跟自己有着一样有趣灵魂的TA. 选择好要阅读哪本书之后, ...

  9. 一些有趣的题目(java)持续更新

    有趣的编程题 1.面试题 2.某公司面试题 1.面试题 此处为正确的代码 package Java.king01.Test;class MicrosoftTest {public static voi ...

  10. 比较有趣的一个笔试题目

    这2天忙于找工作,看.NET笔试题目的时,发现有些笔试题目还是比较有趣的,虽然考的都是基础,但是稍有不慎还是会进入圈套.以下面一个题目为例,听说是晕倒了一群人 - -     class Progra ...

最新文章

  1. java html提取_如何用JAVA从HTML源代码中提取有用的文本信息?
  2. 收藏 | 一文遍览CNN网络结构的发展
  3. 数字经济时代,什么是关键资源?(算力篇)
  4. python类中方法的执行顺序-浅谈Python的方法解析顺序(MRO)
  5. java切换系统输入法_java - 关于Android输入法切换的问题
  6. 这可能是最全面的 python 字符串拼接总结!多种方法选最优
  7. as3 java 交互_求大佬用 Java 实现这段 AS3 的 socket 通讯功能
  8. 前端学习(3313):redux的基本操作
  9. 7-166 二分法求多项式单根 (20 分)
  10. 使用SQL PLUS生成报表
  11. 推荐一些优质原创公众号
  12. 产品经理的私房菜 - 腾讯产品能力模型(序章)
  13. 考研数学——全程复习建议(汤)
  14. 对给定的AOV网络,产生所有的拓扑排序结果,并进行解法的动态演示
  15. 树莓派IMX708摄像头模块
  16. solidworks显示无法连接到服务器,SOLIDWORKS Electrical—无法连接协同服务器
  17. mysql为什么不使用二叉树,MYSQL 索引为什么使用B+树,而不是 B 树,二叉树:
  18. Apache/.htaccess的Order Allow,Deny 详解
  19. 用C语言实现杨辉三角
  20. leetcode 1658

热门文章

  1. 今天修了一个bug,关于debug日志的问题
  2. 微信公众平台开发视频教程
  3. 阿里内部刊物首次公开——《智慧之巅:DT时代的商业革命》出版
  4. 极佳mysql数据库碎片恢复工具,极佳SQL数据库日志恢复工具
  5. Luogu1095 守望者的逃离
  6. 网页隐藏index.php,如何隐藏url中的index.php
  7. java bufferedreader读大文件会内存溢出吗_【JVM成长系列】实战内存溢出异常
  8. dnf全部使用_DNF:1.13拍卖最后1天物价,花瓣礼箱破千万,果然人人都是黑商
  9. es统计有多少个分组_ElasticSearch 分组查询的几个例子
  10. es6 对象中是否有键值_JS获取对象键值对中key值的方法