题目背景

话说上回……还是参见 https://www.luogu.org/problem/show?pid=1373

小a和uim再次来到雨林中探险。突然一阵南风吹来,一片乌云从南部天边急涌过来,还伴着一道道闪电,一阵阵雷声。刹那间,狂风大作,乌云布满了天空,紧接着豆大的雨点从天空中打落下来,只见前方出现了一个牛头马面的怪物,低沉着声音说:“呵呵,既然你们来到这,两个都别活了!”。小a和他的小伙伴再次惊呆了!

题目描述

瞬间,地面上出现了一个H行W列的巨幅矩阵,矩阵的每个格子上要么是空地‘.’或者障碍'#'。

他们起点在(1,1),要逃往(H,W)的出口。他们可以一次向上下左右移动一格,这个算一步操作。不过他们还保留着上次冒险时收集的魔液,一口气喝掉后可以瞬移到相对自己位置的(D,R)向量;也就是说,原来的位置是(x,y),然后新的位置是(x+D,y+R),这个也算一步操作,不过他们仅能至多进行一次这种操作(当然可以不喝魔液)。

这个地方是个是非之地。所以他们希望知道最小能有几步操作可以离开这个鬼地方。不过他们可能逃不出这个鬼地方,遇到这种情况,只能等死,别无他法。

输入输出格式

输入格式:

第一行个整数,H W D R,意义在描述已经说明。

接下来H行,每行长度是W,仅有'.'或者'#'的字符串。

输出格式:

请输出一个整数表示最小的逃出操作次数。如果他们逃不出来,就输出-1。

思路:

其实这道题没有你想象的那么可怕

我们只要广搜即可

我们用一个队列来存走过的长度,目前的位置,还有是否使用过传送

从(1,1)处开始,如果联通,就走

同时,判断此时用不用传送

能传送就传送

如果一个位置以前没走过,就可以走

如果以前是传送过来的,现在不是,也可以走(防止提前传送导致无解)

当然,到达目的地后跳出即可

代码:

#include<iostream>
#include<cstdio>
#define rii register int i
#define rij register int j
#define inf 1<<29
using namespace std;
int cd,bj[][],ans,n,m,wz[][],sd,d,r;
struct dl{
int sd,x,y,sy;
}z[];
int main()
{
scanf("%d%d%d%d\n",&n,&m,&d,&r);
for(rii=;i<=n;i++)
{
for(rij=;j<=m;j++)
{
char ltt;
scanf("%c ",&ltt);
if(ltt=='.')
{
wz[i][j]=;
}
else
{
wz[i][j]=;
}
}
}
for(rii=;i<=n;i++)
{
for(rij=;j<=m;j++)
{
bj[i][j]=inf;
}
}
for(rii=;i<=m+;i++)
{
wz[][i]=;
wz[n+][i]=;
}
for(rii=;i<=n+;i++)
{
wz[i][]=;
wz[i][m+]=;
}
cd=;
z[].x=;
z[].y=;
z[].sd=;
z[].sy=;
bj[][]=;
for(rii=;i<=cd;i++)
{
int ltt=z[i].x;
int kkk=z[i].y;
if(ltt==n&&kkk==m)
{
cout<<z[i].sd;
break;
}
if(wz[ltt-][kkk]!=)
{
if(bj[ltt-][kkk]==inf)
{
cd++;
z[cd].x=ltt-;
z[cd].y=kkk;
z[cd].sy=z[i].sy;
z[cd].sd=z[i].sd+;
bj[ltt-][kkk]=z[i].sy;
}
else
{
if(bj[ltt-][kkk]<z[i].sy)
{
cd++;
z[cd].x=ltt-;
z[cd].y=kkk;
z[cd].sy=z[i].sy;
z[cd].sd=z[i].sd+;
bj[ltt-][kkk]=z[i].sy;
}
}
}
if(wz[ltt+][kkk]!=)
{
if(bj[ltt+][kkk]==inf)
{
cd++;
z[cd].x=ltt+;
z[cd].y=kkk;
z[cd].sd=z[i].sd+;
z[cd].sy=z[i].sy;
bj[ltt+][kkk]=z[i].sy;
}
else
{
if(bj[ltt+][kkk]<z[i].sy)
{
cd++;
z[cd].x=ltt+;
z[cd].y=kkk;
z[cd].sd=z[i].sd+;
z[cd].sy=z[i].sy;
bj[ltt+][kkk]=z[i].sy;
}
}
}
if(wz[ltt][kkk-]!=)
{
if(bj[ltt][kkk-]==inf)
{
cd++;
z[cd].x=ltt;
z[cd].y=kkk-;
z[cd].sd=z[i].sd+;
bj[ltt][kkk-]=z[i].sy;
z[cd].sy=z[i].sy;
}
else
{
if(bj[ltt][kkk-]<z[i].sy)
{
cd++;
z[cd].x=ltt;
z[cd].y=kkk-;
z[cd].sd=z[i].sd+;
bj[ltt][kkk-]=z[i].sy;
z[cd].sy=z[i].sy;
}
}
}
if(wz[ltt][kkk+]!=)
{
if(bj[ltt][kkk+]==inf)
{
cd++;
z[cd].x=ltt;
z[cd].y=kkk+;
z[cd].sd=z[i].sd+;
z[cd].sy=z[i].sy;
bj[ltt][kkk+]=z[i].sy;
}
else
{
if(bj[ltt][kkk+]<z[i].sy)
{
cd++;
z[cd].x=ltt;
z[cd].y=kkk+;
z[cd].sy=z[i].sy;
z[cd].sd=z[i].sd+;
bj[ltt][kkk+]=z[i].sy;
}
}
}
if(wz[ltt+d][kkk+r]!=&&ltt+d<=n&&ltt+d>=&&kkk+r<=m&&kkk+r>=&&z[i].sy==)
{
z[i].sy--;
if(bj[ltt+d][kkk+r]==inf)
{
cd++;
z[cd].x=ltt+d;
z[cd].y=kkk+r;
z[cd].sd=z[i].sd+;
z[cd].sy=z[i].sy;
bj[ltt+d][kkk+r]=z[i].sy;
}
}
if(i==cd)
{
cout<<"-1";
}
}
}

最新文章

  1. PHP中is_numeric函数十六进制绕过0day
  2. Git工作常用
  3. 【转】图解Sql2005创建分区表的全过程
  4. Android 混合开发 的一些心得。
  5. QoS 测量 (目标,方法,协议)
  6. 何谓IOC的核心思想
  7. Ejabberd源码解析前奏--集群
  8. [开发环境] Ubuntu12.04 Telnet服务设置
  9. mvc和webapi同一解决方案调试办法
  10. 操作sql - 类型初始值设定项引发异常
  11. 数据库学习之ADO.NET五大对象
  12. idea 切换新项目 新窗口 原窗口
  13. POJ1222EXTENDED LIGHTS OUT(高斯消元)
  14. awvs的用法
  15. ArrayList源码阅读
  16. C语言程序设计(基础)- 第4周作业
  17. ECharts在柱状图的柱子上方显示数量的方法
  18. 使用vue.js + laravel开发单页面应用
  19. Python3实战系列之七(获取印度售后数据项目)
  20. [EXP]Jenkins 2.150.2 - Remote Command Execution (Metasploit)

热门文章

  1. CSS 面包屑导航栏
  2. JSON初试
  3. 阿里云服务器Linux常用命令
  4. css 条纹背景
  5. Android 使用RecyclerView优雅实现悬浮标题通讯录
  6. 【HTML5】HTML5 综合
  7. matlab中repmat函数的用法(堆叠矩阵)
  8. Snippets代码块分享网站
  9. Poj 1961 KMP
  10. POJ 1190 生日蛋糕 【DFS + 极限剪枝】