题目链接: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. ndoejs处理编码的爬虫

    var express=require('express');var http=require('http');var cheerio=require('cheerio');var fs=requir ...

  2. Flex学习笔记-皮肤

    1文件结构 MXML应用程序 index.mxml 皮肤文件 components.button.skin.btnSkin1.mxml  皮肤文件的组件随便引用了spark.components.Bu ...

  3. linux 任务调度

    crontab 定时任务 -e  编辑 -l  查看 -r  删除 参数 * * * * * 分钟  小时  天数   月   星期几

  4. day33-常见内置模块二(hashlib、shutil、configparse)

    一.hashlib算法介绍 Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等. 1.什么是摘要算法呢? 摘要算法又称哈希算法.散列算法.它通过一个函数,把任意长度的数据转换为一 ...

  5. Windows 8 禁用强制驱动签名

    打开管理员模式的命令行,运行命令: bcdedit.exe -set loadoptions DDISABLE_INTEGRITY_CHECKS bcdedit/set testsigning on ...

  6. BBS--首页、个人站点、ORM

    首页 首页文章排版渲染 登录不登录两种情况 1.bootstrap导航条 点击session 创建登陆后创建人物图表 bootstrap--样式 <li><a href=" ...

  7. ABAP-2-会计凭证批量数据导入本地ACCESS

    ABAP-1-会计凭证批量数据导入本地ACCESS 上一版本出现问题: A.若TXT数据条目超过800万(大概1.3G),则将TXT导入ACCESS过程不成功,ACCESS数据表为空.(Access单 ...

  8. 页面ajax自带的访问后台时,正在加载中

    ajax自带访问后台时,提示正在加载中,加载完成后自动消除遮罩层,代码如下: var mask=mui.createMask();//遮罩层 //传统ajax的post请求方式 mui.ajax('h ...

  9. 3.SLB 回话保持功能分析

    参考文档: 七层会话保持 配置服务器Cookie会话保持常见问题四层监听  

  10. Redis进阶实践之一VMWare Pro虚拟机安装和Linux系统的安装(转载)(1)

    Redis进阶实践之一VMWare Pro虚拟机安装和Linux系统的安装 一.引言 设计模式写完了,相当于重新学了一遍,每次学习都会有不同的感受,对设计模式的理解又加深了,理解的更加透彻了.还差一篇 ...