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 ...
随机推荐
- page事件
using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Secu ...
- C#多线程方法 可传参
//将线程执行的方法和参数都封装到一个类里面.通过实例化该类,方法就可以调用属性来实现间接的类型安全地传递参数.using System; using System.Threading; //Thre ...
- Percona Xtrabackup对数据库进行部分备份
Xtrabackup也可以实现部分备份,即只备份某个或某些指定的数据库或某数据库中的某个或某些表.但要使用此功能,必须启用innodb_file_per_table选项,即每张表保存为一个独立的文件. ...
- window 8 电脑操作服务集合(网址)
如何开启Win8远程桌面 http://jingyan.baidu.com/album/48206aeae06627216ad6b3bf.html?picindex=2 Win8.1用户账户的配置管理 ...
- tee
功能说明:把数据重定向到给定文件和屏幕上. 参数选项: -a 向文件追加内容,而不是覆盖. tee命令允许标准输出同时把内容写入(覆盖)到文件中的实践. tee命令允许标准输出同时把内容 ...
- js 检查内容是否为空
var NoViods = document.getElementsByClassName("NoVoid"); ; i < NoViods.length; i++) { i ...
- InnoDB undo log物理结构的初始化
水平有限,如果有误请指出.一直以来未对Innodb 的undo进行好好的学习,最近刚好有点时间准备学习一下,通过阿里内核月报和自己看代码的综合总结一下.本文环境: 代码版本 percona 5.7.2 ...
- javascrip this指向问题深入理解
在JavaScript中this变量是一个令人难以摸清的关键字,this可谓是非常强大,充分了解this的相关知识有助于我们在编写面向对象的JavaScript程序时能够游刃有余. 1. 一般用处 对 ...
- PAT_A1128#N Queens Puzzle
Source: PAT A1128 N Queens Puzzle (20 分) Description: The "eight queens puzzle" is the pro ...
- Linux的环境配置文件----.bashrc文件
.bashrc文件主要保存个人的一些个性化设置,如命令别名.路径等.也即在同一个服务器上,只对某个用户的个性化设置相关.它是一个隐藏文件,需要使用ls -a来查看. .bash_history 记 ...