[Ctsc2000]冰原探险
Description
传说中,南极有一片广阔的冰原,在冰原下藏有史前文明的遗址。整个冰原被横竖划分成了很多个大小相等的方格。在这个冰原上有N个大小不等的矩形冰山,这些巨大的冰山有着和南极一样古老的历史,每个矩形冰山至少占据一个方格,且其必定完整地占据方格。冰山和冰山之间不会重叠,也不会有边或点相连。以下两种情况均是不可能出现的:
ACM探险队在经过多年准备之后决定在这个冰原上寻找遗址。根据他们掌握的资料,在这个冰原上一个大小为一格的深洞中,藏有一个由史前人类制作的开关。而唯一可以打开这个开关的是一个占据接近一格的可移动的小冰块。显然,在南极是不可能有这样小的独立冰块的,所以这块冰块也一定是史前文明的产物。他们在想办法把这个冰块推到洞里去,这样就可以打开一条通往冰原底部的通道,发掘史前文明的秘密。冰块的起始位置与深洞的位置均不和任何冰山相邻。这个冰原上的冰面和冰山都是完全光滑的,轻轻的推动冰块就可以使这个冰块向前滑行,直到撞到一座冰山就在它的边上停下来。冰块可以穿过冰面上所有没有冰山的区域,也可以从两座冰山之间穿过(见下图)。冰块只能沿网格方向推动。
请你帮助他们以最少的推动次数将冰块推入深洞中。
Input
输入文件第一行为冰山的个数N (1<=N<=4000),第二行为冰块开始所在的方格坐标X1,Y1,第三行为深洞所在的方格坐标X2,Y2,以下N行每行有四个数,分别是每个冰山所占的格子左上角和右下角坐标Xi1,Yi1,Xi2,Yi2
Output
输出文件仅包含一个整数,为最少推动冰块的次数。如果无法将冰块推入深洞中,则输出0。
Sample Input
2
1 1
5 5
1 3 3
6 2 8
Sample Output
3
HINT
数据如下:JudgeOnline/upload/201604/2541.rar
Solution
看上去比较不容易出思路的一道题目。如果这个题坐标范围比较小的话,我们想想是不是可以搞一个bool矩阵直接暴力判断bfs。那么这个题就没有什么难度了。好了,上代码。 那么出题人就故意不写坐标范围,明摆着就是让你这么做然后挂掉的。
那么我们就只能用结构体来保存坐标。经过仔细排查可以发现,我们从一个地方推冰块,那么它就一定要撞到一座冰山,嗯,那么我们就可以预处理出来从一条边能到达的边分别是哪些就可以了,然后从初始点上下左右试一试,最后出解。然后还有一个,从一个横着的边上只能左右推,从一个竖着的边上只能上下推。
那就没什么其他的了,不过代码确实,不短。
Code
#include <iostream>
#include <cmath>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <queue>
#define re register
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int inf = 0x3f3f3f3f;
int A,B,C,D,cnt;
int tot,head[16005],nxt[50005],to[50005],n,num,vis[200001];
int h[200001][2],front,tail;
struct po{
int a,b,c,d,p[10];
}s[4005];
inline int read()
{
int x=0,c=1;
char ch=' ';
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
while(ch=='-') c*=-1,ch=getchar();
while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
return x*c;
}
inline int Up(int x,int y)
{
int ans=0,maxx=-inf;
for(re int i=1;i<=n;i++){
int a=s[i].a,b=s[i].b,c=s[i].c,d=s[i].d;
if(c+1<=x&&y>=b&&y<=d&&maxx<c+1){
maxx=c+1;
ans=s[i].p[2];
}
}
if(y==D&&C<=x&&maxx<C) ans=cnt;
return ans;
}
inline int Down(int x,int y)
{
int ans=0,minn=inf;
for(re int i=1;i<=n;i++){
int a=s[i].a,b=s[i].b,c=s[i].c,d=s[i].d;
if(a-1>=x&&y>=b&&y<=d&&minn>a-1){
minn=a-1;
ans=s[i].p[1];
}
}
if(y==D&&C>=x&&minn>C) ans=cnt;
return ans;
}
inline int Left(int x,int y)
{
int ans=0,maxx=-inf;
for(re int i=1;i<=n;i++){
int a=s[i].a,b=s[i].b,c=s[i].c,d=s[i].d;
if(d+1<=y&&x>=a&&x<=c&&maxx<d+1){
maxx=d+1;ans=s[i].p[4];
}
}
if(x==C&&D<=y&&maxx<D) ans=cnt;
return ans;
}
inline int Right(int x,int y)
{
int ans=0,minn=inf;
for(re int i=1;i<=n;i++){
int a=s[i].a,b=s[i].b,c=s[i].c,d=s[i].d;
if(b-1>=y&&x>=a&&x<=c&&minn>b-1){
minn=b-1;
ans=s[i].p[3];
}
}
if(x==C&&D>=y&&minn>D) ans=cnt;
return ans;
}
inline void add(int from,int too)
{
nxt[++num]=head[from];
to[num]=too;
head[from]=num;
}
inline int bfs()
{
front=0;tail=1;
h[tail][1]=1;
h[tail][2]=0;
while(front<=tail){
int now=h[++front][1],dep=h[front][2];
for(re int i=head[now];i;i=nxt[i]){
int v=to[i];
if(v==cnt) return dep+1;
if(!vis[v]){
vis[v]=1;
h[++tail][1]=v;
h[tail][2]=dep+1;
}
}
}
return 0;
}
int main()
{
n=read();
A=read();B=read();C=read();D=read();
for(re int i=1;i<=n;i++){
s[i].a=read();s[i].b=read();s[i].c=read();s[i].d=read();
}
cnt=1;
for(re int i=1;i<=n;i++)
for(re int j=1;j<=4;j++) s[i].p[j]=++cnt;
++cnt;
int x;
x=Up(A,B); if(x) add(1,x);
x=Down(A,B); if(x) add(1,x);
x=Left(A,B); if(x) add(1,x);
x=Right(A,B); if(x) add(1,x);
for(re int i=1;i<=n;i++){
int a=s[i].a,b=s[i].b,c=s[i].c,d=s[i].d;
int x;
x=Up(a,b-1); if(x) add(s[i].p[3],x);
x=Up(a,d+1); if(x) add(s[i].p[4],x);
x=Down(c,b-1); if(x) add(s[i].p[3],x);
x=Down(c,d+1); if(x) add(s[i].p[4],x);
x=Left(a-1,b); if(x) add(s[i].p[1],x);
x=Left(c+1,b); if(x) add(s[i].p[2],x);
x=Right(a-1,d); if(x) add(s[i].p[1],x);
x=Right(c+1,d); if(x) add(s[i].p[2],x);
}
cout<<bfs();
return 0;
}
[Ctsc2000]冰原探险的更多相关文章
- [题目] Luogu P3716 [CTSC2000]冰原探险
题面 题目背景 传说中,南极有一片广阔的冰原,在冰原下藏有史前文明的遗址.整个冰原被横竖划分成了很多个大小相等的方格.在这个冰原上有N个大小不等的矩形冰山,这些巨大的冰山有着和南极一样古老的历史,每个 ...
- BZOJ 2541: [Ctsc2000]冰原探险
Descrption 有一些矩形障碍,碰到障碍会停下,求从一个点到另一个点的最少移动步数. Sol BFS. 因为题目的特殊性质,两个矩形没有任何相邻,起始点和终点和矩形没有相邻. 所以从一个点的移动 ...
- 【[CTSC2000]冰原探险】
noip前练一下码力还是非常有前途的 这道题本来就是想写个大暴力弃疗的,所以直接强上暴力浑身舒爽 结果发现要不是判重的时候脑残了,就能\(A\)了 没什么好说的呀,就是每一次都暴力\(O(n)\)往上 ...
- 【BZOJ 2541】【Vijos 1366】【CTSC 2000】冰原探险
http://www.lydsy.com/JudgeOnline/problem.php?id=2541 https://vijos.org/p/1366 loli秘制大爆搜_(:з」∠)_坑了好久啊 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- NOIP模拟赛-2018.11.5
NOIP模拟赛 好像最近每天都会有模拟赛了.今天从高二逃考试跑到高一机房,然而高一也要考试,这回好像没有拒绝的理由了. 今天的模拟赛好像很有技术含量的感觉. T1:xgy断句. 好诡异的题目,首先给出 ...
- ASP.NET 5探险(3):使用UMEditor并实现图片上传
(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:今天将继续上一篇来讲解百度富文本Web编辑器UEditor或UMEditor的使用. ...
- POJ 2431 Expedition(探险)
POJ 2431 Expedition(探险) Time Limit: 1000MS Memory Limit: 65536K [Description] [题目描述] A group of co ...
- 读《架构探险——从零开始写Java Web框架》
内容提要 <架构探险--从零开始写Java Web框架>首先从一个简单的 Web 应用开始,让读者学会如何使用 IDEA.Maven.Git 等开发工具搭建 Java Web 应用:接着通 ...
随机推荐
- 免费iOS第三方推送工具Urban Airship使用教程
本文转载至 http://blog.csdn.net/mamong/article/details/8542404 http://www.dapps.net/dev/iphone/ios-free ...
- 面试之Java持久层(十)
91,什么是ORM? 对象关系映射(Object-Relational Mapping,简称ORM)是一种为了解决程序的面向对象模型与数据库的关系模型互不匹配问题的技术: 简单的说,O ...
- ORA-00257错误的解决办法
author: headsen chen date: 2018-04-17 11:12:39 notice:个人原创,转载请注明作者和出处,否则依法追击法律责任. 1,oracle数据库正常使用中 ...
- iOS Xcode之SVN(remove git)
项目用SVN比较多,所以大家都把精力放在如何在XCODE上使用SVN. 配置SVN当然是很简单,但提交都默认出现git的提交窗,否则要到repositories界面去提交. 目前没有找到什 ...
- 云计算之路-阿里云上:SLB会话保持的一个坑
冒着被大家厌烦的风险,今天再发一篇“云计算之路-阿里云上”.这是在前一篇发过之后真实发生的事情,我们觉得定位问题的过程值得分享.而且估计园子里不少朋友被这个问题骚扰过,我们有责任让大家知道问题的真正原 ...
- 第二课——解析mysqldump命令和mysqlbinlog命令+innodb和Myisam存储引擎简介
环境说明 mysql版本:Percona-Server-5.6.30 IP:10.7.15.167 端口:3306 安装目录:/httx/run/mysql 数据目录:/httx/run/mysql/ ...
- 原生js实现ajax方法
下面是一个比较完整的Ajax function ajax(){ var ajaxData = { type:arguments[0].type || "GET", url:argu ...
- Delphi中MD5实现方法(转)
原来写过一个计算MD5的程序,是用了一个叫MD5.pas的单元,使用起来还算简单,但还有更简单的办法,安装了indy就会有IdHashMessageDigest单元(delphi 7默认安装indy) ...
- vc判断当前用户是否具有administrator 权限代码
BOOL IsAdmin() { HANDLE hAccessToken; BYTE * InfoBuffer = ]; PTOKEN_GROUPS ptgGroups; DWORD dwInfoBu ...
- Linux(8)- nginx+uWSGI+virtualenv+supervisor 发布web服务器
一.理论梳理 WSGI是web服务器的网关接口,它是一个规范,描述了web服务器(下图中的WEB server)如何与web应用程序(下图中的Application)通信,以及web应用程序如何链接在 ...