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 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...
随机推荐
- 用XCA(X Certificate and key management)可视化程序管理SSL 证书(3)--创建自己定义的凭证管理中心(Certificate Authority)
在第"用XCA(X Certificate and key management)可视化程序管理SSL 证书(2)---创建证书请求"章节中,我们介绍了怎样用XCA创建SSL证书请 ...
- MongoDB学习笔记(四) 用MongoDB的文档结构描述数据关系
MongoDB的集合(collection)可以看做关系型数据库的表,文档对象(document)可以看做关系型数据库的一条记录.但两者并不完全对等.表的结构是固定的,MongoDB集合并没有这个约束 ...
- unity 调用android函数
unity 调用android函数 分类: unity2013-12-19 17:54 475人阅读 评论(0) 收藏 举报 unityandroidjar 我们知道,安卓project都有一个And ...
- 利用开源HTML5引擎lufylegend.js结合javascript实现的五子棋人机对弈
前言 本文主要介绍利用开源引擎 lufylegend.js开发基于Html5的游戏--五子棋,主要叙述其详细开发过程. 游戏规则 玩过五子棋的都应该知道五子棋的规则,这里就简单介绍其规则. 1 ...
- Java抓取网页数据(原来的页面+Javascript返回数据)
转载请注明出处! 原文链接:http://blog.csdn.net/zgyulongfei/article/details/7909006 有时候因为种种原因,我们须要採集某个站点的数据,但因为不同 ...
- C++ 直方图匹配算法代码
/*-------------------------------------------------------------------------*/ // 函数名称: histeq() // 传 ...
- IP Editor IP控件(对比一下封装IP控件)
HWND hIpEdit; void __fastcall TForm2::FormCreate(TObject *Sender) { hIpEdit = CreateWindow(WC_IPADDR ...
- 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 ...
- nohup sort -k1 -n -t$'\t' ./bigfile.16 -o./test/bigfile.16.ok &
nohup sort -k1 -n -t$'\t' ./bigfile.16 -o./test/bigfile.16.ok &
- AeroGear.js 1.2.0 发布,手机Web应用脚手架 - 开源中国社区
AeroGear.js 1.2.0 发布,手机Web应用脚手架 - 开源中国社区 AeroGear.js 1.2.0 发布,手机Web应用脚手架