POJThe Doors AND NYIST 有趣的问题
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 有趣的问题的更多相关文章
- 谈谈一些有趣的CSS题目(十二)-- 你该知道的字体 font-family
开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...
- 谈谈一些有趣的CSS题目(十一)-- reset.css 知多少?
开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...
- 几个有趣的WEB设备API(二)
浏览器和设备之间还有很多有趣的接口, 1.屏幕朝向接口 浏览器有两种方法来监听屏幕朝向,看是横屏还是竖屏. (1)使用css媒体查询的方法 /* 竖屏 */ @media screen and (or ...
- 谈谈一些有趣的CSS题目(三)-- 层叠顺序与堆栈上下文知多少
开本系列,讨论一些有趣的 CSS 题目,抛开实用性而言,一些题目为了拓宽一下解决问题的思路,此外,涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题中有你感觉 ...
- 谈谈一些有趣的CSS题目(一)-- 左边竖条的实现方法
开本系列,讨论一些有趣的 CSS 题目,抛开实用性而言,一些题目为了拓宽一下解决问题的思路,此外,涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题中有你感觉 ...
- 谈谈一些有趣的CSS题目(二)-- 从条纹边框的实现谈盒子模型
开本系列,讨论一些有趣的 CSS 题目,抛开实用性而言,一些题目为了拓宽一下解决问题的思路,此外,涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题中有你感觉 ...
- 谈谈一些有趣的CSS题目(四)-- 从倒影说起,谈谈 CSS 继承 inherit
开本系列,讨论一些有趣的 CSS 题目,抛开实用性而言,一些题目为了拓宽一下解决问题的思路,此外,涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题中有你感觉 ...
- 谈谈一些有趣的CSS题目(五)-- 单行居中,两行居左,超过两行省略
开本系列,讨论一些有趣的 CSS 题目,抛开实用性而言,一些题目为了拓宽一下解决问题的思路,此外,涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题中有你感觉 ...
- 谈谈一些有趣的CSS题目(六)-- 全兼容的多列均匀布局问题
开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...
随机推荐
- kgdb调试注意事项
0 首先提下注意事项的背景: kgdb和printk共用一个串口 1 设置波特率: //最高支持460800波特率 arm-eabi-gdb ./vmlinux ...
- android图片压缩的3种方法实例
android 图片压缩方法: 第一:质量压缩法: private Bitmap compressImage(Bitmap image) { ByteArrayOutputStream baos = ...
- 14.2.5.5 Change Buffer
14.2.5.5 Change Buffer change buffer是一个指定的数据结构 用于caches 数据到secondary index pages 当影响的pages 不是在buffer ...
- Java反射机制的使用方法
Java的反射机制同意你在程序执行的过程中获取类定义的细节.有时候在程序执行的时候才得知要调用哪个方法,这时候反射机制就派上用场了. 获取类 类的获取方法有下面几种: forName().通过Clas ...
- SystemParametersInfo API学习(128个中文参数解释,215个实际值)
uiAction:该参数指定要查询或设置的系统级参数.其取值如下:SPI_GETACCESSTIMEOUT:检索与可访问特性相关联的超时段的信息,PvParam参数必须指向某个ACCESSTIMEOU ...
- drupal THEME主要文件
**.info 文件** .info 文件是一个必需的文件:Drupal 必须包括它,才干看到主题. .info 文件告诉 Drupal 主题的内部名称.比如,假设这个文件的名称是 ibmtheme. ...
- javascript --- 事件托付
javascript 之 事件托付 长处:1.提高性能(仅仅须要对父级进行操作,子节点相同会拥有其相关属性和方法) 2.对于新加入的事件.也让其拥有父级事件的属性 <!doctype html& ...
- hdu 3488 Tour
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3488 题意:给你一个N个顶点M条边的带权有向图,要你把该图分成1个或多个不相交的有向环.且所有定点都只 ...
- 如何开发auto complete 智能提示功能
目录(?)[+] 如何开发auto complete 智能提示功能 最近网上好像流传用redis实现,其实智能提示和用什么存储关系不大 07年,我过一个类似的项目 我有几千个名字,随着用户在输入框中不 ...
- 基于Qt的类QQ气泡聊天的界面开发
近期在写IM 聊天界面,想设计出一个类似QQ气泡聊天的样式 使用了几种办法 1:使用Qt以下的QListview来实现QQ类似效果.差强人意 2:使用QWebview载入html css样式来完毕.发 ...