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彻底删除mysql
删除 mysql sudo apt-get autoremove --purge mysql-server-5.0sudo apt-get remove mysql-serversudo apt-ge ...
- 点(.)运算符和箭头(->)运算符的区别
本机中,char类型数据占用1byte, unsigned int, int, long int, float类型的数据占用4 bytes, double类型的数据占用8bytes. 至于指向所有基本 ...
- nginx在linux下的目录结构
配置文件目录 putty 下 whereis nginx /etc/nginx
- CABasicAnimation 几种停止的回调
一.编写一个简单的动画,使一个UIview从屏幕的左上角移动到左下角,间隔时间3S // // ViewController.m // CAAnimationTest // // Created by ...
- lua的string库
lua支持的所有字符类 . 任意字符 %a 字母 %c 控制字符 %d 数字 %l 小写字母 %p 标点字符 %s 空白符 %u 大写字母 %w 字母 ...
- ESPlatform 支持的三种群集模型 —— ESFramework通信框架 4.0 进阶(09)
对于最多几千人同时在线的通信应用,通常使用单台服务器就可以支撑.但是,当同时在线的用户数达到几万.几十万.甚至百万的时候,我们就需要很多的服务器来分担负载.但是,依据什么规则和结构来组织这些服务器,并 ...
- php使用iconv进行从utf-8转为gb2312字符编码出错或截断的解决方案
iconv("GB2312","UTF-8",$text);修改为以下其中一种:1.iconv("UTF-8","GBK" ...
- digitalocean更换机房教程
使用本站优惠链接注册digitalocean账户,可获赠10美元digitalocean优惠码.新用户点击create,即可创建一台新的vps,10美元余额足够你使用一台512MB内存的vps长达两月 ...
- Linux RSS/RPS/RFS/XPS对比
RSS适合于多队列网卡,把不同的流分散的不同的网卡多列中,至于网卡队列由哪个cpu处理还需要绑定网卡队列中断与cpu RPS:适合于单队列网卡或者虚拟网卡,把该网卡上的数据流让多个cpu处理 RFS: ...
- CSSd的优先级别
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...