题面

题意:给你一个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. 【Oracle】OGG(Oracle GoldenGate)简介及搭建过程

    GoldenGate公司简介 GoldenGate公司专注于数据同步领域,是实现数据同步技术的领导者.至2007年,在全球35个国家售出超过2000个许可证,客户分布在政府.银行.电信.证券.传媒.医 ...

  2. 【技术累积】【点】【java】【18】URLEncode

    基础概念 由于以URL的形式传递信息给服务器时,不允许URL中出现一些特殊字符和空格的,所以需要对URL进行编码处理. 原理是: 将要转码的字符转变为16进制: 从右到左,每两位前面加% 哪些字符是需 ...

  3. java操作Excel的poi的字体设置

    package com.java.poi; import org.apache.poi.hssf.usermodel.HSSFWorkbook;import org.apache.poi.ss.use ...

  4. phtoshop CC2018破解简单过程

    1.下载adobe photoshop cc 2018(可以用360安全卫士下载)-->并安装2.下载破解补丁,破解补丁下载地址:http://www.xue51.com/soft/1377.h ...

  5. select和epoll最大的区别

    先说说阻塞,因为一个线程只能处理一个套接字的I/O事件,如果想同时处理多个,可以利用非阻塞忙轮询的方式,伪代码如下: while true { for i in stream[] { if i has ...

  6. 死磕itchat源码--core.py

    core.py文件中的Core类定义了itchat的所有接口.且,仅仅是定义了接口,全部在component包中实现重构.其用法如下表述: 缺省 源码如下: # -*- encoding: utf-8 ...

  7. Codeforces Round #548 (Div. 2) C. Edgy Trees

    You are given a tree (a connected undirected graph without cycles) of 

  8. Qt5.11+opencv3.4的配置安装

    系统:Windows 10 64位 前期准备: 1.CMake下载安装 下载地址:https://cmake.org/download/ 选择msi安装文件,按照提示一步一步按照就好 可以参考:htt ...

  9. mysql如何删除数据库指定ID段的数据库。比如删除id 1-500的数据。

    delete from tablename where id>=1 and id<=500或者DELETE FROM `数据库名称`.`数据表名称` WHERE `house_cs`.`i ...

  10. ZEAL--可以查看所有软件API的软件

    windows平台上最强大的可以查看所有API的软件,从此再也不用去各个网站上扒了,而且有时还有Greate Wall 点我下载