题面

题意:给你一个20*20的地图,起点(0,0),终点(n-1,n-1),有障碍的点为‘#’,每次可以向8个方向走一步,还给了一个三角形,除了障碍以外,到这8个方向上的点的线段如果没有与三角形相交,那么就可以到达,问最少步数

题解:主要是判断线段与三角形的相交,去年在现场和大多题解都是慢慢讨论,因为这个线段其实可以在边上,可以与三角形有交点,

今天重现才想到,只需要线段上有一点在三角形内部就不能走,坐标范围不大,直接枚举线段上200个点,挨着判断就行

在判断点在三角形内部时,注意顺时针逆时针啊,板子注意啊

 #include<bits/stdc++.h>
const int inf=0x7fffffff/;
const double eps=1e-;
using namespace std;
int dcmp(double x)
{
return (x>eps)-(x<-eps);
}
struct point
{
double x,y;
point(){}
point(double x,double y):x(x),y(y){ }
point operator - (const point b){return point(x-b.x,y-b.y);}
}a[];
double dot(point a,point b){return a.x*b.x+a.y*b.y;}
double cross(point a,point b){return a.x*b.y-a.y*b.x;} int n,m,t,h,en,dis[],used[];
int id[][],p,head[];
char x[];
int dx[]={,,,,,-,-,-};
int dy[]={,,,-,-,-,,};
queue<int>q;
struct rec
{
int go,next;
}eg[];
void build(int a,int b)
{
p++;
eg[p].go=b;
eg[p].next=head[a];
head[a]=p;
}
bool pointin(point p)
{
return dcmp(cross(a[]-a[],p-a[]))> && dcmp(cross(a[]-a[],p-a[]))> && dcmp(cross(a[]-a[],p-a[]))>;
} bool check(point x,point y)
{
double ax=y.x-x.x;
double ay=y.y-x.y;
for (double i=;i<=;i=i+1.0)
{
point t;
t.x=x.x+ax/200.0*i;
t.y=x.y+ay/200.0*i;
if (pointin(t)==) return ;
}
return true;
} void spfa(int n)
{
memset(used,,sizeof(used));
while (!q.empty())q.pop();
for (int i=;i<=n;i++) dis[i]=inf;
q.push();
used[]=;
dis[]=;
while (!q.empty())
{
int x=q.front();q.pop();
for (int u=head[x];u;u=eg[u].next)
{
int v=eg[u].go;
if (dis[x]+<dis[v])
{
dis[v]=dis[x]+;
if (!used[v])
{
q.push(v);
used[v]=;
}
}
}
used[x]=;
}
} int main()
{
while (scanf("%d",&n)!=EOF)
{
p=;
memset(head,,sizeof(head));
memset(id,,sizeof(id));
for (int i=;i<;i++) scanf("%lf%lf",&a[i].x,&a[i].y);
if (dcmp(cross(a[]-a[],a[]-a[]))<) swap(a[],a[]); for (int i=n-;i>=;i--)
{
scanf("%s",x);
for (int j=;j<n;j++)
if (x[j]=='#' || pointin(point(j,i))==) id[i][j]=-;
}
if (id[][]==- || id[n-][n-]==-)
{
puts("-1");
continue;
}
t=;
for (int i=;i<n;i++)
for (int j=;j<n;j++)
if (id[i][j]!=-)
{
t++;
id[i][j]=t;
} for (int i=;i<n;i++)
for (int j=;j<n;j++)
{
if (id[i][j]==-) continue;
for (int k=;k<;k++)
{
int nx=i+dx[k];
int ny=j+dy[k];
if (id[nx][ny]==- || nx< || nx>=n || ny< || ny>=n) continue;
if (check(point(j,i),point(ny,nx)))
{
//printf("%d %d\n",id[i][j],id[x][y]);
build(id[i][j],id[nx][ny]);
}
}
} en=id[n-][n-];
spfa(en);
if (dis[en]==inf)puts("-1");else printf("%d\n",dis[en]);
}
return ;
}

hihoCoder-1633 ACM-ICPC北京赛区2017 G.Liaoning Ship’s Voyage 线段与三角形规范相交的更多相关文章

  1. ACM ICPC Kharagpur Regional 2017

    ACM ICPC Kharagpur Regional 2017 A - Science Fair 题目描述:给定一个有\(n\)个点,\(m\)条无向边的图,其中某两个点记为\(S, T\),另外标 ...

  2. 2017 ACM/ICPC(北京)总结

    这个季节的,北京真的很冷. 下午的热身赛,我依然先去敲一道搜索题,但是很不幸这道搜索题坑点还是蛮多的,浪费了好长时间后依然没能A掉,期间Codeblocks崩溃一次使得代码完全丢失,在队友的建议下便暂 ...

  3. hihoCoder 1578 Visiting Peking University 【贪心】 (ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛)

    #1578 : Visiting Peking University 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 Ming is going to travel for ...

  4. hihoCoder 1582 Territorial Dispute 【凸包】(ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛)

    #1582 : Territorial Dispute 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 In 2333, the C++ Empire and the Ja ...

  5. hihoCoder 1584 Bounce 【数学规律】 (ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛)

    #1584 : Bounce 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 For Argo, it is very interesting watching a cir ...

  6. hihoCoder 1586 Minimum 【线段树】 (ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛)

    #1586 : Minimum 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 You are given a list of integers a0, a1, …, a2 ...

  7. 【最短路】【Heap-dijkstra】hihocoder 1587 ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛 J. Typist's Problem

    题意:给你一个串,仅含有a~g,且每个字母只出现最多一次.和一个光标初始位置,以及一个目标串,问你最少要多少的代价变化成目标串. 有五种操作:在光标前添加一个未出现过的字母,代价1. 删除光标前或者光 ...

  8. hihocoder 1586 ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛-题目9 : Minimum【线段树】

    https://hihocoder.com/problemset/problem/1586 线段树操作,原来题并不难..... 当时忽略了一个重要问题,就是ax*ay要最小时,x.y可以相等,那就简单 ...

  9. hihoCoder 1632 Secret Poems(ACM-ICPC北京赛区2017网络同步赛)

    时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 The Yongzheng Emperor (13 December 1678 – 8 October 1735), was ...

随机推荐

  1. NetCore下获取项目文件路径

    我要获取的是doc/FPFile.xml 百度了一大堆就是找不到解决问题. 把属性更改为始终赋值, XmlDocument xdi = new XmlDocument(); xdi.Load((&qu ...

  2. dubbo之多协议

    (1) 不同服务不同协议 比如:不同服务在性能上适用不同协议进行传输,比如大数据用短连接协议,小数据大并发用长连接协议 consumer.xml <?xml version="1.0& ...

  3. 4星|《OKR实践指南》:老司机经验谈

    OKR 实践指南:知乎任向晖.雷明灿作品 (知乎「一小时」系列) 作者所在的公司已经实施了OKR十个季度了.算是目前少有的OKR老司机.书中介绍的是作者的实践经验,在目前的OKR中文书中这本算是比较少 ...

  4. (转)基于Metronic的Bootstrap开发框架经验总结(6)--对话框及提示框的处理和优化

    http://www.cnblogs.com/wuhuacong/p/4775282.html 在各种Web开发过程中,对话框和提示框的处理是很常见的一种界面处理技术,用得好,可以给用户很好的页面体验 ...

  5. (转)OpenLayers3基础教程——OL3基本概念

    http://blog.csdn.net/gisshixisheng/article/details/46756275 OpenLayers3基础教程——OL3基本概念 从本节开始,我会陆陆续续的更新 ...

  6. 微信小程序跳转以及跳转的坑

    一.首先小程序的跳转方法有一下几种 js控制跳转 // 保留当前页面,跳转到应用内的某个页面 wx.navigateTo({ url: '../blueberry/blueberry' }); // ...

  7. nginx + php 403 原因分析

    环境:nginx + php 问题: 配置的网站,访问出现报错:Access Denied (403) 常见解决方法: 1.文件权限问题 可能是文件权限问题,没有读权限. 或者selinux没有关闭. ...

  8. 团体程序设计天梯赛-练习集-*L1-043. 阅览室

    L1-043. 阅览室 天梯图书阅览室请你编写一个简单的图书借阅统计程序.当读者借书时,管理员输入书号并按下S键,程序开始计时:当读者还书时,管理员输入书号并按下E键,程序结束计时.书号为不超过100 ...

  9. Leetcode 动态规划 - 简单

    1. 最大子序和 (53) 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4], 输 ...

  10. 文件元数据、文件夹操作(day08)

    一.获取文件的元数据(meta data) 通过read write可以对文件的内容进行读写. 但是今天我们要操作的是文件的元数据(文件的属性信息) day08$ls -l hello -rw-rw- ...