POJ1556 The Doors 叉积+最短路
题目大意:求从(0,5)到(10,5)的最短距离,起点与终点之间有n堵墙,每个墙有2个门。
题目思路:判断两点间是否有墙(判断两点的连线是否与某一堵墙的线段相交),建立一个图,然后最短路求出就可以了。
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<queue>
#define INF 0x3f3f3f3f
#define MAX 1005 double Map[MAX][MAX],dist[MAX];
int n,vis[MAX],G[MAX][MAX];//G储存点的序号
struct node
{
double x[],y[];
int len;
}point[MAX]; double Cross(double x1,double y1,double x2,double y2,double x3,double y3,double x4,double y4)//叉积
{
double a=(x2-x1)*(y3-y1)-(x3-x1)*(y2-y1);
double b=(x2-x1)*(y4-y1)-(x4-x1)*(y2-y1);
return a*b;
} int check(double x1,double y1,double x2,double y2,int pos1,int pos2)//判断两点的连线是否与某一段墙相交
{
for(int i=pos1+;i<pos2;i++)
{
if(Cross(x1,y1,x2,y2,point[i].x[],,point[i].x[],point[i].y[])<1e- && Cross(point[i].x[],,point[i].x[],point[i].y[],x1,y1,x2,y2)<1e-)
return ;
if(Cross(x1,y1,x2,y2,point[i].x[],point[i].y[],point[i].x[],point[i].y[])<1e- && Cross(point[i].x[],point[i].y[],point[i].x[],point[i].y[],x1,y1,x2,y2)<1e-)
return ;
if(Cross(x1,y1,x2,y2,point[i].x[],point[i].y[],point[i].x[],)<1e- && Cross(point[i].x[],point[i].y[],point[i].x[],,x1,y1,x2,y2)<1e-)
return ;
}
return ;
} double Dist(double x1,double y1,double x2,double y2)//求两点间距离
{
return sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2));
} double dij()//最短路
{
int k;
double minn;
memset(vis,,sizeof(vis));
for(int i=;i<=*n+;i++)
dist[i]=Map[][i];
dist[]=;
vis[]=;
for(int i=;i<*n+;i++)
{
minn=INF;
for(int j=;j<=*n+;j++)
{
if(minn>dist[j] && !vis[j])
{
k=j;
minn=dist[j];
}
}
vis[k]=;
for(int j=;j<=*n+;j++)
{
if(dist[j] > Map[k][j]+dist[k])
dist[j]=Map[k][j]+dist[k];
}
}
return dist[*n+];
} int main()
{
int cnt;
double x,y;
while(scanf("%d",&n),n!=-)
{
cnt=;
point[].len=;
point[n+].len=;
G[][]=;
point[].x[]=;
point[].y[]=;
point[n+].x[]=;
point[n+].y[]=;
G[n+][]=*n+;
for(int i=;i<MAX;i++)
for(int j=;j<MAX;j++)
Map[i][j]=INF;
for(int i=;i<=n;i++)
{
scanf("%lf",&x);
point[i].len=;
for(int j=;j<=;j++)
{
scanf("%lf",&y);
point[i].x[j]=x;
point[i].y[j]=y;
G[i][j]=++cnt;
}
}
for(int i=;i<=n;i++)
{
for(int j=;j<=point[i].len;j++)
{
x=point[i].x[j];
y=point[i].y[j];
for(int q=i+;q<=n+;q++)
{
for(int f=;f<=point[q].len;f++)
{
double x1=point[q].x[f];
double y1=point[q].y[f];
int op=check(x,y,x1,y1,i,q);
if(op)
{
int a=G[i][j];
int b=G[q][f];
Map[a][b]=Dist(x,y,x1,y1);
}
}
}
}
}
double ans=dij();
printf("%.2lf\n",ans);
}
return ;
}
POJ1556 The Doors 叉积+最短路的更多相关文章
- 2018.07.06 POJ1556 The Doors(最短路)
The Doors Time Limit: 1000MS Memory Limit: 10000K Description You are to find the length of the shor ...
- poj1556 The Doors(叉积判断线段相交)
题目链接:https://vjudge.net/problem/POJ-1556 题意:在一个矩形内,起点(0,5)和终点(10,5)是固定的,中间有n个道墙(n<=18),每道墙有两个門,求起 ...
- POJ 1556 The Doors【最短路+线段相交】
思路:暴力判断每个点连成的线段是否被墙挡住,构建图.求最短路. 思路很简单,但是实现比较复杂,模版一定要可靠. #include<stdio.h> #include<string.h ...
- POJ 1556 The Doors(计算几何+最短路)
这题就是,处理出没两个点.假设能够到达,就连一条边,推断可不能够到达,利用线段相交去推断就可以.最后求个最短路就可以 代码: #include <cstdio> #include < ...
- POJ1556 The Doors [线段相交 DP]
The Doors Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 8334 Accepted: 3218 Descrip ...
- The Doors(几何+最短路,好题)
The Doors http://poj.org/problem?id=1556 Time Limit: 1000MS Memory Limit: 10000K Total Submissions ...
- 【转】最短路&差分约束题集
转自:http://blog.csdn.net/shahdza/article/details/7779273 最短路 [HDU] 1548 A strange lift基础最短路(或bfs)★254 ...
- 转载 - 最短路&差分约束题集
出处:http://blog.csdn.net/shahdza/article/details/7779273 最短路 [HDU] 1548 A strange lift基础最短路(或bfs)★ ...
- 【kuangbin专题】计算几何基础
1.poj2318 TOYS 传送:http://poj.org/problem?id=2318 题意:有m个点落在n+1个区域内.问落在每个区域的个数. 分析:二分查找落在哪个区域内.叉积判断点与线 ...
随机推荐
- ubuntu 14.04 GDAL
autotools-dev comerr-dev hdf5-helpers icu-devtools krb5-multidev libarmadillo4 libarpack2 libblas3 l ...
- 自己写的POIUtil,主要解决从不同的HSSFWorkbook复制sheet以及根据单元格插入图片等
复制sheet的原始代码网上找的,但是小问题很多,然后自己动手改了一下: 根据单元格信息动态插入图片,如果单元格有文字,图片的位置会在文字之后,如果同样的位置已有图片则会往下插入. import or ...
- ThinkPHP框架基础
ThinkPHP 一.php框架基础介绍 真实项目开发步骤: 多人同时开发项目,协作开发项目.分工合理.效率有提高(代码风格不一样.分工不好) 测试阶段 上线运行 对项目进行维护.修改.升级(单个人维 ...
- spring配置文件详解【总结】
知其然,知其所以然 <?xml version="1.0" encoding="UTF-8"?> <beans:beans xmlns=&qu ...
- 分析函数 over用法 之row_number() runk_number
分析函数用于计算基于组的某种聚合值,每个组返回多个行,而聚合函数每个组只返回一个行 表: create table TB_SCORE ( id NUMBER(10), class VARCHAR2(1 ...
- gson学习以及进阶文章推荐
Json转换利器Gson之实例一-简单对象转化和带泛型的List转化 (http://blog.csdn.net/lk_blog/article/details/7685169)Json转换利器Gso ...
- HDU 5804 Price List
只需和总和比较即可. #pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> ...
- VBS基础篇 - 对象(5) - File对象
VBS基础篇 - 对象(5) - File对象 描述:提供对文件所有属性的访问,从FSO对象的GetFile方法获得. 使用File对象 要用File对象模型来编程必须先用FileS ...
- Linux 压缩解压命令
.tar 解包:tar xvf FileName.tar 打包:tar cvf FileName.tar DirName (注:tar是打包,不是压缩!) ---------------------- ...
- CSS3秘笈:第三章
1.标签选择器:控制整体. 使用标签选择器,只需要输入标签的名称即可. 2.类选择器:精确控制. 假如你要指定一些相同的元素拥有不同的样式,可以给元素添加不同的类名,然后用类选择器来应用对应的样式. ...