最短路+叉积 poj1556
题目链接:The Doors - POJ 1556 - Virtual Judge https://vjudge.net/problem/POJ-1556
题意是叫我们计算从(0,5)到(10,5)的最短路,中间会给出n道墙,每道墙会有两扇门可以通过,第一行是数字n,接下来n行,每行有x,y1,y2,y3,y4,表示横坐标为x的门上的四个点坐标。
在这里主要是把图建出来,我的做法是先把所有点和墙存下来,然后枚举每两点,这两点要满足横坐标不同,并且两点的连线不经过在两点的横坐标之间的墙,假设我们有两个点p1,p2,有一道墙的横坐标是x,那么只要(p1.x-x)*(p2.x-x)<0,这两个点就在墙的左右两边,然后再判断和墙有没有交点,这个用叉积计算墙的两点是不是在我们两点连线的两边,把图建完就用floyd或者dijkstra计算一下最短路就可以了,可能讲的不是很清楚,看一下代码:
struct node{
double x,y;
}p[]; //存点
struct ss{
node a,b;
}wall[];//存墙
我写的有点麻烦:
p[].x=,p[].y=;
p[].x=,p[].y=;//起点和终点分别存进去
cnt1=; //点的数量
cnt2=; //墙的数量
for(int i=;i<n;i++)
{
double x,y;
cin>>x;
cin>>y;
p[cnt1].x=x,p[cnt1].y=y; //第一个点
wall[cnt2].a=p[cnt1]; //第一道墙
wall[cnt2].b.x=x;
wall[cnt2].b.y=;
cnt1++;
cnt2++; cin>>y;
p[cnt1].x=x,p[cnt1].y=y; //第二个点
cnt1++; cin>>y;
p[cnt1].x=x,p[cnt1].y=y; //第三个点 wall[cnt2].a=p[cnt1];
wall[cnt2].b=p[cnt1-]; //第二道墙
cnt1++;
cnt2++; cin>>y;
p[cnt1].x=x,p[cnt1].y=y; //第四个点和第三道墙,好麻烦
wall[cnt2].a=p[cnt1];
wall[cnt2].b.x=x;
wall[cnt2].b.y=;
cnt1++;
cnt2++;
}
判断两点之间有没有墙
bool jug(int a,int b)
{
for(int i=;i<cnt2;i++)
{
double x=wall[i].a.x;
double k=(p[a].x-x)*(p[b].x-x); //判断墙在两点之间
double k1=cross(p[a],p[b],wall[i].a);//判断墙的两点是否在连点的直线两边
double k2=cross(p[a],p[b],wall[i].b);
if(k<&&k1*k2<eps)
return true;
}
return false;
}
完整代码:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
#define eps 1e-10
#define inf 9999999
struct node{
double x,y;
}p[];
struct ss{
node a,b;
}wall[];
double map[][];
int n,m,k,t,cnt1,cnt2;
double dis(node a,node b)
{
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
double cross(node a,node b,node c)
{
return (b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x);
}
bool jug(int a,int b)
{
for(int i=;i<cnt2;i++)
{
double x=wall[i].a.x;
double k=(p[a].x-x)*(p[b].x-x);
double k1=cross(p[a],p[b],wall[i].a);
double k2=cross(p[a],p[b],wall[i].b);
if(k<&&k1*k2<eps)
return true;
}
return false;
}
void floyd()
{
for(int k=;k<cnt1;k++)
{
for(int i=;i<cnt1;i++)
{
for(int j=;j<cnt1;j++)
{
if(i!=j&&map[i][j]>map[i][k]+map[k][j])
{
map[i][j]=map[i][k]+map[k][j];
}
}
}
}
}
int main()
{
while(cin>>n)
{
if(n<)
break;
p[].x=,p[].y=;
p[].x=,p[].y=;
cnt1=;
cnt2=;
for(int i=;i<n;i++)
{
double x,y;
cin>>x;
cin>>y;
p[cnt1].x=x,p[cnt1].y=y;
wall[cnt2].a=p[cnt1];
wall[cnt2].b.x=x;
wall[cnt2].b.y=;
cnt1++;
cnt2++; cin>>y;
p[cnt1].x=x,p[cnt1].y=y;
cnt1++; cin>>y;
p[cnt1].x=x,p[cnt1].y=y; wall[cnt2].a=p[cnt1];
wall[cnt2].b=p[cnt1-];
cnt1++;
cnt2++; cin>>y;
p[cnt1].x=x,p[cnt1].y=y;
wall[cnt2].a=p[cnt1];
wall[cnt2].b.x=x;
wall[cnt2].b.y=;
cnt1++;
cnt2++;
}
for(int i=;i<cnt1;i++)
{
for(int j=;j<cnt1;j++)
map[i][j]=inf;
}
for(int i=;i<cnt1-;i++)
{
for(int j=i+;j<cnt1;j++)
{
if(i!=j&&p[i].x!=p[j].x&&!jug(i,j))
{
map[i][j]=map[j][i]=dis(p[i],p[j]);
}
}
}
floyd();
printf("%.2f\n",map[][]);
}
return ;
}
最短路+叉积 poj1556的更多相关文章
- POJ1556 The Doors 叉积+最短路
题目大意:求从(0,5)到(10,5)的最短距离,起点与终点之间有n堵墙,每个墙有2个门. 题目思路:判断两点间是否有墙(判断两点的连线是否与某一堵墙的线段相交),建立一个图,然后最短路求出就可以了. ...
- poj1556 The Doors(叉积判断线段相交)
题目链接:https://vjudge.net/problem/POJ-1556 题意:在一个矩形内,起点(0,5)和终点(10,5)是固定的,中间有n个道墙(n<=18),每道墙有两个門,求起 ...
- POJ1556 最短路 + 线段相交问题
POJ1556 题目大意:比较明显的题目,在一个房间中有几堵墙,直着走,问你从(0,5)到(10,5)的最短路是多少 求最短路问题,唯一变化的就是边的获取,需要我们获取边,这就需要判断我们想要走的这条 ...
- POJ-1556 The Doors---线段相交+最短路
题目链接: https://vjudge.net/problem/POJ-1556 题目大意: 给一个10*10的正方形房间中间用墙隔开每个墙上有两个门,给出门的两个端点坐标求从左边中点走到右边中点所 ...
- 2018.07.06 POJ1556 The Doors(最短路)
The Doors Time Limit: 1000MS Memory Limit: 10000K Description You are to find the length of the shor ...
- POJ 1556 The Doors【最短路+线段相交】
思路:暴力判断每个点连成的线段是否被墙挡住,构建图.求最短路. 思路很简单,但是实现比较复杂,模版一定要可靠. #include<stdio.h> #include<string.h ...
- 简单几何(线段相交+最短路) POJ 1556 The Doors
题目传送门 题意:从(0, 5)走到(10, 5),中间有一些门,走的路是直线,问最短的距离 分析:关键是建图,可以保存所有的点,两点连通的条件是线段和中间的线段都不相交,建立有向图,然后用Dijks ...
- BZOJ 2433 智能车比赛(计算几何+最短路)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2433 题意:若干个矩形排成一排(同一个x之上最多有一个矩形),矩形i和i+1相邻.给定两 ...
- POJ 1556 The Doors(计算几何+最短路)
这题就是,处理出没两个点.假设能够到达,就连一条边,推断可不能够到达,利用线段相交去推断就可以.最后求个最短路就可以 代码: #include <cstdio> #include < ...
随机推荐
- java 设计模式http://www.runoob.com/design-pattern/design-pattern-tutorial.html
参考:http://www.runoob.com/design-pattern/design-pattern-tutorial.html
- <table>导出excal
<table>导出excal 将<table>导出为excal文件,这里介绍两种方法. 1.直接写代码,拼接出excal文件的字符串,然后直接用a标签下载.本人没有是试过,在此 ...
- jsfl 生成flash 工具面板
利用flash组件的List做界面,先从flash中拖出List组件,然后删除.绑定Main类. package { import flash.display.Sprite; import flash ...
- kafka config
Config parameters that influence the log retention time. log.roll.hours # how long to produce a new ...
- RabbitMQ系列教程之六:远程过程调用(RPC)(转载)
RabbitMQ系列教程之六:远程过程调用(RPC) 远程过程调用(Remote Proceddure call[RPC]) (本实例都是使用的Net的客户端,使用C#编写) 在第二个教程中,我们学习 ...
- [PC]PHPCMS配置文件的读取
--------------------------------------------------------------------------------------------------- ...
- ArcGIS(ESRI)的发展历史和版本历史(简介)
作者:fenghuayoushi 来源:CSDN 原文:https://blog.csdn.net/fenghuayoushi/article/details/6677360 ESRI公司介绍 ...
- C++ 关于 CMFCPropertyGridCtrl 的使用方法 之一 (原创)
题外话: 最近在写一个重要的程序,想做的更灵活一些,于是想采用属于对话框的形式,如图所示 但查了好几本大部门的C++及MFC的书,还有很多的网上的资料,这方面的介绍实在是少之又少.不过,好在VS201 ...
- java网页技术
About jQuery Getting started with jQuery can be easy or challenging, depending on your experience wi ...
- Requests库的文档高级用法
高级用法 本篇文档涵盖了 Requests 的一些高级特性. 会话对象 会话对象让你能够跨请求保持某些参数.它也会在同一个 Session 实例发出的所有请求之间保持 cookie, 期间使用 url ...