题目链接: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的更多相关文章

  1. POJ1556 The Doors 叉积+最短路

    题目大意:求从(0,5)到(10,5)的最短距离,起点与终点之间有n堵墙,每个墙有2个门. 题目思路:判断两点间是否有墙(判断两点的连线是否与某一堵墙的线段相交),建立一个图,然后最短路求出就可以了. ...

  2. poj1556 The Doors(叉积判断线段相交)

    题目链接:https://vjudge.net/problem/POJ-1556 题意:在一个矩形内,起点(0,5)和终点(10,5)是固定的,中间有n个道墙(n<=18),每道墙有两个門,求起 ...

  3. POJ1556 最短路 + 线段相交问题

    POJ1556 题目大意:比较明显的题目,在一个房间中有几堵墙,直着走,问你从(0,5)到(10,5)的最短路是多少 求最短路问题,唯一变化的就是边的获取,需要我们获取边,这就需要判断我们想要走的这条 ...

  4. POJ-1556 The Doors---线段相交+最短路

    题目链接: https://vjudge.net/problem/POJ-1556 题目大意: 给一个10*10的正方形房间中间用墙隔开每个墙上有两个门,给出门的两个端点坐标求从左边中点走到右边中点所 ...

  5. 2018.07.06 POJ1556 The Doors(最短路)

    The Doors Time Limit: 1000MS Memory Limit: 10000K Description You are to find the length of the shor ...

  6. POJ 1556 The Doors【最短路+线段相交】

    思路:暴力判断每个点连成的线段是否被墙挡住,构建图.求最短路. 思路很简单,但是实现比较复杂,模版一定要可靠. #include<stdio.h> #include<string.h ...

  7. 简单几何(线段相交+最短路) POJ 1556 The Doors

    题目传送门 题意:从(0, 5)走到(10, 5),中间有一些门,走的路是直线,问最短的距离 分析:关键是建图,可以保存所有的点,两点连通的条件是线段和中间的线段都不相交,建立有向图,然后用Dijks ...

  8. BZOJ 2433 智能车比赛(计算几何+最短路)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2433 题意:若干个矩形排成一排(同一个x之上最多有一个矩形),矩形i和i+1相邻.给定两 ...

  9. POJ 1556 The Doors(计算几何+最短路)

    这题就是,处理出没两个点.假设能够到达,就连一条边,推断可不能够到达,利用线段相交去推断就可以.最后求个最短路就可以 代码: #include <cstdio> #include < ...

随机推荐

  1. oracle 相关操作

    1,SqlPlus 的使用 1.01,软登入:sqlplus /nolog 1.02,登入 dba 用户:sqlplus /as sysdba 2,用户相关操作 2.01,创建用户:create us ...

  2. Kubernetes中pod创建流程

    转自:https://blog.csdn.net/yan234280533/article/details/72567261 Pod是Kubernetes中最基本的部署调度单元,可以包含contain ...

  3. js对象及元素复制拷贝

    1.数组及对象拷贝: 浅拷贝var b=$.extend(false,{},a);//对象浅拷贝 var a={aa:111,bb:{bb1:22}}; var b=$.extend(false,{} ...

  4. DOS 格式化日期时间输出

    if "%date:~5,2%" lss "10" (set mm=0%date:~6,1%) else (set mm=%date:~5,2%)if &quo ...

  5. Arraylist JDk1.8扩容和遍历

    Arraylist作为最简单的集合,需要熟悉一点,记录一下---->这边主要是注意一下扩容和遍历的过程 请看以下代码 public static void main(String[] args) ...

  6. 把网卡中断绑定到CPU,最大化网卡的吞吐量(转)

    先来看一下问题, 我们通过 ifconfig 查看接口的名称 为 p15p1, 一般机器为 eth0 再通过命令 ➜ ~ cat /proc/interrupts | head -n 1 && ...

  7. ReactiveX 学习笔记(15)使用 Rx.NET + Json.NET 调用 REST API

    JSON : Placeholder JSON : Placeholder (https://jsonplaceholder.typicode.com/) 是一个用于测试的 REST API 网站. ...

  8. windows7 IIS7报错:如果要使用托管的处理程序,请安装 ASP.NET

    IIS7报错:如果要使用托管的处理程序,请安装 ASP.NET windows7,部署在本地的IIS7里以后,结果不能访问承载SL的.aspx页面,而如果用.html承载则可以访问. 亲测可用修复办法 ...

  9. 吴裕雄 python神经网络 水果图片识别(5)

    #-*- coding:utf-8 -*-### required libaraiedimport osimport matplotlib.image as imgimport matplotlib. ...

  10. PR(Precision-Recall)曲线和mAP指标

    来自: https://www.zhihu.com/question/41540197 https://www.douban.com/note/518998773/ 作者:水哥链接:https://w ...