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. 【C语言天天练(十五)】字符串输入函数fgets、gets和scanf

    引言:假设想把一个字符串读到程序中.必须首先预留存储字符串的空间.然后使用输入函数来获取这个字符串. 读取字符串输入的第一件事是建立一个空间以存放读入的字符串. char *name; scanf(& ...

  2. open sql 更新数据

    insert语句: 1.插入单行数据有两种方法:wa是一个工作区 insert into dbtab values wa. insert into dbtab from wa. 该语句也可以将数据行插 ...

  3. Webbrowser加载Flash后方向键失效问题(用到了OLE接口,没有被处理就转发,够复杂的)

    原文:http://blog.csdn.net/dropme/article/details/6253528 窗体上放一个ApplicationEvent控件,OnMessage事件中这么写 uses ...

  4. cocos2d/-x 用CCRenderTexture为一个CCLabelTTF创建阴影。

    游戏UI中为了使字体更加漂亮,通常需要为字体添加一个阴影.其实不用美工,程序就可以添加.先为CCLabelTTF创建一个CCRenderTexture: CCRenderTexture* CCLabe ...

  5. [IDEs]Eclipse For Mac , 常用快捷键

    Cmd + O:  查看.java中得方法,变量,等结构 Cmd + T:     查看继承关系 Cmd + K:          查找下一个选中的成员 Cmd + E:  查看已经打开的文件 Cm ...

  6. java基础---->java调用oracle存储过程(转)

    存储过程是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它.今天 ...

  7. mysql update 有无索引对比

    <pre name="code" class="html">mysql> desc ProductInfo; +--------------- ...

  8. linux下C语言socket网络编程简例

    原创文章,转载请注明转载字样和出处,谢谢! 这里给出在linux下的简单socket网络编程的实例,使用tcp协议进行通信,服务端进行监听,在收到client的连接后,发送数据给client:clie ...

  9. codeforces.com/contest/325/problem/B

    http://codeforces.com/contest/325/problem/B B. Stadium and Games time limit per test 1 second memory ...

  10. 《转》Linux下的多线程编程

    原地址:http://linux.chinaunix.net/doc/program/2001-08-11/642.shtml 1 引言 线程(thread)技术早在60年代就被提出,但真正应用多线程 ...