hihoCoder-1633 ACM-ICPC北京赛区2017 G.Liaoning Ship’s Voyage 线段与三角形规范相交
题意:给你一个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 线段与三角形规范相交的更多相关文章
- ACM ICPC Kharagpur Regional 2017
		
ACM ICPC Kharagpur Regional 2017 A - Science Fair 题目描述:给定一个有\(n\)个点,\(m\)条无向边的图,其中某两个点记为\(S, T\),另外标 ...
 - 2017 ACM/ICPC(北京)总结
		
这个季节的,北京真的很冷. 下午的热身赛,我依然先去敲一道搜索题,但是很不幸这道搜索题坑点还是蛮多的,浪费了好长时间后依然没能A掉,期间Codeblocks崩溃一次使得代码完全丢失,在队友的建议下便暂 ...
 - hihoCoder 1578  Visiting Peking University 【贪心】 (ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛)
		
#1578 : Visiting Peking University 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 Ming is going to travel for ...
 - hihoCoder 1582 Territorial Dispute 【凸包】(ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛)
		
#1582 : Territorial Dispute 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 In 2333, the C++ Empire and the Ja ...
 - hihoCoder 1584 Bounce 【数学规律】 (ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛)
		
#1584 : Bounce 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 For Argo, it is very interesting watching a cir ...
 - hihoCoder 1586 Minimum 【线段树】 (ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛)
		
#1586 : Minimum 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 You are given a list of integers a0, a1, …, a2 ...
 - 【最短路】【Heap-dijkstra】hihocoder 1587 ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛 J. Typist's Problem
		
题意:给你一个串,仅含有a~g,且每个字母只出现最多一次.和一个光标初始位置,以及一个目标串,问你最少要多少的代价变化成目标串. 有五种操作:在光标前添加一个未出现过的字母,代价1. 删除光标前或者光 ...
 - hihocoder  1586   ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛-题目9 : Minimum【线段树】
		
https://hihocoder.com/problemset/problem/1586 线段树操作,原来题并不难..... 当时忽略了一个重要问题,就是ax*ay要最小时,x.y可以相等,那就简单 ...
 - hihoCoder 1632 Secret Poems(ACM-ICPC北京赛区2017网络同步赛)
		
时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 The Yongzheng Emperor (13 December 1678 – 8 October 1735), was ...
 
随机推荐
- Mongo连接远程数据库
			
mongo IP+Port CrabyterV5 首先这么操作是基于配置了环境变量的,可以参照http://www.cnblogs.com/daiyonghui/p/5209076.html mong ...
 - java中负数的补码转换为十进制
			
一个数如果为正,则它的原码.反码.补码相同:一个正数的补码,将其转化为十进制,可以直接转换. 已知一个负数的补码,将其转换为十进制数,步骤: 1.先对各位取反: 2.将其转换为十进制数: 3.加上负号 ...
 - iOS https 证书链获取
			
- (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)chall ...
 - 简单servlet调用dao层完整步骤
			
导入包lib(文件名称) 目录结构:web下:views.web-inf.index.jsp views下各种jsp文件和js(里面放封装好的jquery包) js下:jquery包(js文件后缀) ...
 - CDR中国元素圆形花纹矢量图制作流程
			
在论坛中看到这样一个问题,想要使用CorelDRAW矢量绘图工具做出下图所示的中国元素圆形花纹矢量图,小编潜心研究一下,最终有了绘制方法,今天给大家分享下. 步骤一:画同心圆,先画出10个,这个是根据 ...
 - 微信小程序 请求超时处理
			
1.在app.json加入一句 "networkTimeout": { "request": 10000 } 设置超时时间,单位毫秒 2.请求 wx.reque ...
 - Spring+SprinMVC配置学习总结
			
一千个人有一千种spring的配置方式,真是这样.看了好多的配置,试验了很多.这里做一个总结. 1 原理上,spring和springmvc可以合并为一个配置文件然后在web.xml中加载,因为最终的 ...
 - BZOJ 3943: [Usaco2015 Feb]SuperBull 最小生成树
			
Code: // luogu-judger-enable-o2 #include<bits/stdc++.h> #define setIO(s) freopen(s".in&qu ...
 - 读取linux服务器内带格式文件,转为json字符串
			
工具类方法:ReadTextUtil package com.dc.health.platform.common.utils; import com.alibaba.fastjson.JSONObje ...
 - 爬虫系列(六) 用urllib和re爬取百度贴吧
			
这篇文章我们将使用 urllib 和 re 模块爬取百度贴吧,并使用三种文件格式存储数据,下面先贴上最终的效果图 1.网页分析 (1)准备工作 首先我们使用 Chrome 浏览器打开 百度贴吧,在输入 ...