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个区域内.问落在每个区域的个数. 分析:二分查找落在哪个区域内.叉积判断点与线 ...
随机推荐
- ggplot2 theme相关设置—矩形设置(rect)
在主题设置中,rect设置主要用于设置图例和面板 element_rect(fill = NULL, colour = NULL, size = NULL, linetype = NULL, colo ...
- [SOJ] 图的广度优先搜索
Time Limit: 1sec Memory Limit:256MB Description 读入图的邻接矩阵以及一个顶点的编号(图中顶点的编号为从1开始的连续正整数.顶点在邻接矩阵的行和列上 ...
- SQL 列提取组成字符串
SELECT BussinessNo = STUFF(REPLACE(REPLACE((SELECT N.business_no FROM T_delegate_list N WHERE N.g_mo ...
- chapter 13_2 关系类、库定义的元方法
元表还可以指定关系操作符的含义,元方法为__eq ,__lt(小于) ,__le(小于等于). 而其它3个关系操作符则没有单独的元方法,Lua会 把a ~= b 转化为not(a == b) 将a&g ...
- 【Loadrunner】初学Loadrunner——安装
一.准备工作 1.下载Loadrunner可以参考网上百度得到的可以在下面这个地址下载,比较大,4G左右 http://www.genilogix.com/downloads/loadrunner/l ...
- SDK does not contain any platforms. error (android)
By default sdk was installed under the C:\Users\<user_name>\AppData\Local\Android\sdk\ directo ...
- D - 娜娜梦游仙境系列——村民的怪癖
D - 娜娜梦游仙境系列——村民的怪癖 Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Othe ...
- Jenkins - 持续集成环境搭建【转】
1. Jenkins 概述 Jenkins是一个开源的持续集成工具.持续集成主要功能是进行自动化的构建.自动化构建包括自动编译.发布和测试,从而尽快地发现集成错误,让团队能够更快的开发内聚的软件. 2 ...
- 肢体语言心理学+FBI阅人术(行为心理学) 用最短的时间了解一个人
肢体语言心理学 如何从站姿判断人 每个人都有自己习惯的站立姿势.美国夏威夷大学心理学家指出,不同的站姿可以显示出一个人的性格特征. 站立时习惯把双手插入裤袋的人:城府较深,不轻易向人表露内心 ...
- 一些常用数据库操作在mysql及sql server中实现方式的差异
因为本文强调的是不同点,所以先讲述不同点,再讲相同点. 一.不同点 1.创建表时主键id的自增实现方式不一样 mysql数据库的实现方式是auto_increment,示例如下 CREATE TABL ...