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. 百度贴吧客户端(Android)网络通信行为分析

    百度贴吧安卓客户端网络通信行为分析 本文由CSDN-蚍蜉撼青松[主页:http://blog.csdn.net/howeverpf]原创,转载请注明出处! 一.实验环境与结果概述 1.1 实验环境   ...

  2. 经常使用MD5算法代码

    经常使用的MD5算法代码日期: 2014年8月4日作者: 铁锚 MD5,全称为 Message Digest Algorithm 5(消息摘要算法第五版).详情请參考 维基百科:MD5  MD5加密后 ...

  3. SAP ABAP exporting list to memory ...SUBMIT 程序传输屏幕参数

    SUBMIT report EXPORTING LIST TO MEMORY              AND RETURN. submit 关键字的作用就是在程序内部调用一个程序,and retur ...

  4. Struts2获取演示示例教程

    回想Struts2的使用过程,网上搜的教程多多少少都会有点问题.又一次记录下创建过程,方便查阅. 1.下载Struts2的jar包 下载地址:http://archive.apache.org/dis ...

  5. ThinkPHP使用分组详细介绍(十七)

    原文:ThinkPHP使用分组详细介绍(十七) 使用分组(模块分组) *就是将多个项目合并到一个项目/应用去(就是Home.Admin) ---分组不分组看自己的建立项目习惯,个人习惯用根目录配置生成 ...

  6. 14.4.3.2 Configuring Multiple Buffer Pool Instances 配置多个buffer pool 实例:

    14.4.3.2 Configuring Multiple Buffer Pool Instances 配置多个buffer pool 实例: 对于系统 buffer pool 有多个G的范围, 把b ...

  7. Python逐块读取大文件行数的代码 - 为程序员服务

    Python逐块读取大文件行数的代码 - 为程序员服务 python数文件行数最简单的方法是使用enumerate方法,但是如果文件很大的话,这个方法就有点慢了,我们可以逐块的读取文件的内容,然后按块 ...

  8. python中逐行读取文件的最佳方式_Drupal_新浪博客

    python中逐行读取文件的最佳方式_Drupal_新浪博客 python中逐行读取文件的最佳方式    (2010-08-18 15:59:28)    转载▼    标签:    python   ...

  9. Android图片与旋转

    拍照后的照片有时被系统旋转,纠正过程例如以下: 1.先读取图片文件被旋转的角度: /** * 通过ExifInterface类读取图片文件的被旋转角度 * @param path : 图片文件的路径 ...

  10. C语言复合字面量的使用

    C99添加的特性,复合字面量(composite literal).一旦熟悉并使用,便会体会到简洁强大的表达. 所谓字面量就是固定数值的表示.数值和字符串类型都有字面量的表达.如: // 100, 1 ...