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;
}



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

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

  1. 谈谈一些有趣的CSS题目(十二)-- 你该知道的字体 font-family

    开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...

  2. 谈谈一些有趣的CSS题目(十一)-- reset.css 知多少?

    开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...

  3. 几个有趣的WEB设备API(二)

    浏览器和设备之间还有很多有趣的接口, 1.屏幕朝向接口 浏览器有两种方法来监听屏幕朝向,看是横屏还是竖屏. (1)使用css媒体查询的方法 /* 竖屏 */ @media screen and (or ...

  4. 谈谈一些有趣的CSS题目(三)-- 层叠顺序与堆栈上下文知多少

    开本系列,讨论一些有趣的 CSS 题目,抛开实用性而言,一些题目为了拓宽一下解决问题的思路,此外,涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题中有你感觉 ...

  5. 谈谈一些有趣的CSS题目(一)-- 左边竖条的实现方法

    开本系列,讨论一些有趣的 CSS 题目,抛开实用性而言,一些题目为了拓宽一下解决问题的思路,此外,涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题中有你感觉 ...

  6. 谈谈一些有趣的CSS题目(二)-- 从条纹边框的实现谈盒子模型

    开本系列,讨论一些有趣的 CSS 题目,抛开实用性而言,一些题目为了拓宽一下解决问题的思路,此外,涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题中有你感觉 ...

  7. 谈谈一些有趣的CSS题目(四)-- 从倒影说起,谈谈 CSS 继承 inherit

    开本系列,讨论一些有趣的 CSS 题目,抛开实用性而言,一些题目为了拓宽一下解决问题的思路,此外,涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题中有你感觉 ...

  8. 谈谈一些有趣的CSS题目(五)-- 单行居中,两行居左,超过两行省略

    开本系列,讨论一些有趣的 CSS 题目,抛开实用性而言,一些题目为了拓宽一下解决问题的思路,此外,涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题中有你感觉 ...

  9. 谈谈一些有趣的CSS题目(六)-- 全兼容的多列均匀布局问题

    开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...

随机推荐

  1. 4. Qt的容器类

      Qt提供来一组通用的基于模板的容器类. 一. QList类,QLinkedList类 和  QVector类         QList类.QLinkedList类和QVector类常常使用到的Q ...

  2. Webserver管理系列:11、注意默认的隐含共享

    安装完Windows Server 2008之后默认的c/d/e...磁盘是共享的. 我们能够通过取消"Microsoft网络的文件和打印机共享"服务来阻止别人訪问我们的共享文件:

  3. Java加入背景音乐

    近期有几个师妹找我给她们的Java期末作业加入背景音乐,非常久不琢磨Java的我花费整晚才搞定,羞愧.在博客中记录下来.警示自己.也帮助一下大家. Java中能够通过AudioClip类来实现音乐播放 ...

  4. 四张类图理一下Streams的用法

    首先是输出流 OutputStream.继承它的类有两种,一种是底层实现(纯继承OutputStream的类),一种是格式转换(组合了OutputStream的类). 所谓的底层实现,就是真正和物理存 ...

  5. 手把手教你修改pcduino系统默认的音频输出

    最近要搞个小玩意儿,要用到pcduino的音频输出,但是系统默认的是输出到hdmi的音频,我的显示器上没有喇叭,只能搞个USB声卡.但是系统默认又不是输出到USB,这里我手把手叫你怎么设置系统默认声卡 ...

  6. Android本地视频播放器开发--视频解码

    在上一章Android本地视频播放器开发--SDL编译编译中编译出sdl的支持库,当时我们使用的2.0,但是有些api被更改了,所以在以下的使用者中我们使用SDL1.3的库,这个库我会传上源码以及编译 ...

  7. 低头看—SQL视频

    迷迷糊糊半个月过去了,耿大姐的数据库视频也在一知半解中看完.虽然耿大妈讲的很详细,很细心,但是我还是时不时的犯困(还不如看儿童英语动画片有精神呢)视频看是看完了,但东西不是自己的.这个时候就需要“颗粒 ...

  8. 4.windows和Linux下创建oracleusername表空间,表,插入数据,用户管理表等操作

    进入超级管理员,运行下面命令 Window下创建数据库.表空间,用户,插入数据等操作 -- 01 创建表空间 -- 注意表空间的路径 依据实际安装环境进行调整 CREATE TABLESPACE ts ...

  9. VS快捷键教程

    删除或剪切一行(Ctrl + X) 不须要选择不论什么文本, 用来剪切一行, 最经常使用来删除一行.  删除一行也能用 Shift+Delete 格式化整个文档(Ctrl + K, Ctrl + D) ...

  10. hdu 1536(博弈)

    传送门:S-Nim 题意:给n个数的集合s, 再给m 组数据,每组表示 k 堆石子,每次可以取的个数只能是集合s中的数量.问先手胜还是输? 分析:sg函数的经典运用,先预处理出所有数量为0~10000 ...