poj1556 The Doors(叉积判断线段相交)
题目链接:https://vjudge.net/problem/POJ-1556
题意:在一个矩形内,起点(0,5)和终点(10,5)是固定的,中间有n个道墙(n<=18),每道墙有两个門,求起点到终点的最短路。
思路:
最多有4*n+2个点,枚举所有点对(p1,p2),用叉积判断线段p1p2和中间的墙是否相交,不相交那么更新距离为两点的距离,否则为inf。更新所有的边之后用floyd得到最短路。答案即dist[0][4*n+1]。时间复杂度O(n^3)。
AC code:
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstdlib>
using namespace std; const int maxn=;
const double eps=1e-;
const double inf=1e20;
int n;
double dist[maxn][maxn]; int sgn(double x){
if(abs(x)<eps) return ;
if(x<) return -;
return ;
} struct Point{
double x,y;
Point(){}
Point(double xx,double yy):x(xx),y(yy){}
Point operator + (const Point& b){
return Point(x+b.x,y+b.y);
}
Point operator - (const Point& b){
return Point(x-b.x,y-b.y);
}
double operator * (const Point& b){
return x*b.x+y*b.y;
}
double operator ^ (const Point& b){
return x*b.y-b.x*y;
}
}; struct Line{
Point s,e;
Line(){}
Line(Point ss,Point ee){
s=ss,e=ee;
}
}line[maxn]; bool inter(Line l1,Line l2){
return
max(l1.s.x,l1.e.x)>=min(l2.s.x,l2.e.x)&&
max(l2.s.x,l2.e.x)>=min(l1.s.x,l1.e.x)&&
max(l1.s.y,l1.e.y)>=min(l2.s.y,l2.e.y)&&
max(l2.s.y,l2.e.y)>=min(l1.s.y,l1.e.y)&&
sgn((l1.s-l2.s)^(l2.e-l2.s))*sgn((l1.e-l2.s)^(l2.e-l2.s))<=&&
sgn((l2.s-l1.s)^(l1.e-l1.s))*sgn((l2.e-l1.s)^(l1.e-l1.s))<=;
} double dis(Point a,Point b){
return sqrt((b-a)*(b-a));
} int main(){
while(scanf("%d",&n),n!=-){
double x,yy1,yy2,yy3,yy4;
for(int i=;i<=n;++i){
scanf("%lf%lf%lf%lf%lf",&x,&yy1,&yy2,&yy3,&yy4);
line[*i-]=Line(Point(x,yy1),Point(x,yy2));
line[*i]=Line(Point(x,yy3),Point(x,yy4));
}
for(int i=;i<=*n+;++i)
for(int j=;j<=*n+;++j)
if(i==j) dist[i][j]=;
else dist[i][j]=inf;
for(int i=;i<=*n;++i){
int id=(i+)/;
Point tmp;
if(i&) tmp=line[(i+)/].s;
else tmp=line[(i+)/].e;
int flag=;
for(int j=;j<id;++j)
if(!inter(Line(Point(,),tmp),line[*j-])&&
!inter(Line(Point(,),tmp),line[*j])){
flag=;break;
}
if(flag) dist[][i]=dist[i][]=dis(Point(,),tmp);
flag=;
for(int j=id+;j<=n;++j)
if(!inter(Line(tmp,Point(,)),line[*j-])&&
!inter(Line(tmp,Point(,)),line[*j])){
flag=;break;
}
if(flag) dist[*n+][i]=dist[i][*n+]=dis(tmp,Point(,));
}
for(int i=;i<=*n;++i)
for(int j=i+;j<=*n;++j){
int id1=(i+)/,id2=(j+)/;
int flag=;
Point p1,p2;
if(i&) p1=line[(i+)/].s;
else p1=line[(i+)/].e;
if(j&) p2=line[(j+)/].s;
else p2=line[(j+)/].e;
for(int k=id1+;k<id2;++k)
if(!inter(Line(p1,p2),line[*k-])&&
!inter(Line(p1,p2),line[*k])){
flag=;break;
}
if(flag) dist[i][j]=dist[j][i]=dis(p1,p2);
}
int flag=;
for(int i=;i<=n;++i)
if(!inter(Line(Point(,),Point(,)),line[*i-])&&
!inter(Line(Point(,),Point(,)),line[*i])){
flag=;break;
}
if(flag) dist[][*n+]=dist[*n+][]=;
for(int k=;k<=*n+;++k)
for(int i=;i<=*n+;++i)
for(int j=;j<=*n+;++j)
dist[i][j]=min(dist[i][j],dist[i][k]+dist[k][j]);
printf("%.2f\n",dist[][*n+]);
}
return ;
}
poj1556 The Doors(叉积判断线段相交)的更多相关文章
- POJ 1066--Treasure Hunt(判断线段相交)
Treasure Hunt Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 7857 Accepted: 3247 Des ...
- 【POJ 2653】Pick-up sticks 判断线段相交
一定要注意位运算的优先级!!!我被这个卡了好久 判断线段相交模板题. 叉积,点积,规范相交,非规范相交的简单模板 用了“链表”优化之后还是$O(n^2)$的暴力,可是为什么能过$10^5$的数据? # ...
- hdu 1086(判断线段相交)
传送门:You can Solve a Geometry Problem too 题意:给n条线段,判断相交的点数. 分析:判断线段相交模板题,快速排斥实验原理就是每条线段代表的向量和该线段的一个端点 ...
- POJ_1066_Treasure Hunt_判断线段相交
POJ_1066_Treasure Hunt_判断线段相交 Description Archeologists from the Antiquities and Curios Museum (ACM) ...
- POJ_2653_Pick-up sticks_判断线段相交
POJ_2653_Pick-up sticks_判断线段相交 Description Stan has n sticks of various length. He throws them one a ...
- POJ 2826 An Easy Problem? 判断线段相交
POJ 2826 An Easy Problem?! -- 思路来自kuangbin博客 下面三种情况比较特殊,特别是第三种 G++怎么交都是WA,同样的代码C++A了 #include <io ...
- 还记得高中的向量吗?leetcode 335. Self Crossing(判断线段相交)
传统解法 题目来自 leetcode 335. Self Crossing. 题意非常简单,有一个点,一开始位于 (0, 0) 位置,然后有规律地往上,左,下,右方向移动一定的距离,判断是否会相交(s ...
- POJ 2653 Pick-up sticks(判断线段相交)
Pick-up sticks Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 7699 Accepted: 2843 De ...
- 判断线段相交(hdu1558 Segment set 线段相交+并查集)
先说一下题目大意:给定一些线段,这些线段顺序编号,这时候如果两条线段相交,则把他们加入到一个集合中,问给定一个线段序号,求在此集合中有多少条线段. 这个题的难度在于怎么判断线段相交,判断玩相交之后就是 ...
随机推荐
- MySQL GROUP BY 语句
GROUP BY 语句根据一个或多个列对结果集进行分组. 在分组的列上我们可以使用 COUNT, SUM, AVG,等函数. GROUP BY 语法 SELECT column_name, funct ...
- ckeditor不能粘贴word的问题
在之前在工作中遇到在富文本编辑器中粘贴图片不能展示的问题,于是各种网上扒拉,终于找到解决方案,在这里感谢一下知乎中众大神以及TheViper. 通过知乎提供的思路找到粘贴的原理,通过TheViper找 ...
- 【概率论】4-3:方差(Variance)
title: [概率论]4-3:方差(Variance) categories: - Mathematic - Probability keywords: - Variance - Standard ...
- CodeForces 494B Obsessive String ——(字符串DP+KMP)
这题的题意就很晦涩.题意是:问有多少种方法,把字符串s划分成不重叠的子串(可以不使用完s的所有字符,但是这些子串必须不重叠),使得t串是所有这些新串的子串.譬如第一个样例,"ababa&qu ...
- 黑马vue---59-60、组件中的data和methods
黑马vue---59-60.组件中的data和methods 一.总结 一句话总结: 1. 组件可以有自己的 data 数据 2. 组件的 data 和 实例的 data 有点不一样,实例中的 dat ...
- jquery - 定义二维数组
var products = []; products.push({product_id: '1',count: 3},{product_id:'2',count: 6})
- (六)爬虫之使用selenium
selenium是使用javascript编写,主要用来进行web应用程序测试,在python爬虫中可以用来进行动态网页爬取,解决爬虫中的javascript渲染(执行js语句).总结记录下,以备后面 ...
- C++ STL partial_sort_copy iterator
vector<int>::iterator iter1 = partial_sort_copy(deq1.begin(), deq1.end(), vec1.begin(), vec1.e ...
- LSTM_Model
#!/usr/bin/python# -*- coding: utf-8 -*- import tensorflow as tf class TRNNConfig(object): "&qu ...
- org/springframework/cache/jcache/config/AbstractJCacheConfiguration.class
在使用Spring-MVC环境时 报错: Failed to parse configuration class [org.springframework.cache.aspectj.AspectJ ...