题面

题意:给你一个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. Java关于反射的用法

    一. 首先是准备一个需要反射的类 public class Person { private String name; private int age; public String sex; publ ...

  2. CXF-JAX-RS开发(二)spring整合CXF-JAX-RS

    一.创建maven工程[Packaging:war] 1.目录结构 2.坐标书写 二.导入依赖和tomcat服务器插件 <dependencies> <!-- CXF --> ...

  3. react基础篇四

    列表 & Keys 渲染多个组件 你可以通过使用{}在JSX内构建一个元素集合 下面,我们使用Javascript中的map()方法遍历numbers数组.对数组中的每个元素返回<li& ...

  4. 06--c++友元类

    =======================什么是友元类======================= 当一个类B成为了另外一个类A的“朋友”时,那么类A的私有和保护的数据成员就可以被类B访问.我们 ...

  5. Graph network classification(As a beginner, continue to update)

    Data arrangement 1.Reference Webs http://nlp.csai.tsinghua.edu.cn/~tcc/ https://blog.csdn.net/a60964 ...

  6. Express+Nodejs 下的登录拦截实现

    Express+Nodejs 下的登录拦截实现 利用商城举例,在商城中没有登录之前,可以看商品列表.详情.登录或者注册都可以,但是购买的时候是不行的,那么这个功能在Node后台中是怎么实现的呢,这个功 ...

  7. 浅谈Json数据格式

    我们先来看下w3cschool对json的定义: JSON:JavaScript 对象表示法(JavaScript Object Notation). JSON 是存储和交换文本信息的语法.类似 XM ...

  8. tomcat 热加载设置

    找到tomcat项目的apache-tomcat-8.0.30\conf\context.xml,打开进行编辑,把Context项中加上 reloadable="true" < ...

  9. 【转载】java读取.properties配置文件的几种方法

    读取.properties配置文件在实际的开发中使用的很多,总结了一下,有以下几种方法(仅仅是我知道的):一.通过jdk提供的java.util.Properties类.此类继承自java.util. ...

  10. Git创建本地分支并关联远程分支(一)

    默认,git项目只有一个分支,就是master,我们当然可以在本地创建多个分支,并推送到远程git管理平台上,或者将远程git管理平台上的其他分支拉取到自己电脑上. 一.查看本地已有的分支 进入到项目 ...