题目背景

话说上回……还是参见 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:
3 6 2 1
…#..
..##..
..#…
输出样例#1:
5
输入样例#2:
3 7 2 1
..#..#.
.##.##.
.#..#..
输出样例#2:
-1
输入样例#3:
6 6 -2 0
.#….
.#.#..
.####.
.#..#.
.##.#.
….#.
输出样例#3:
21
说明

样例解释1

(1,1)→(1,2)→(1,3)→喝(3,4)→(3,5)→(3,6)

样例解释2

因为只有一瓶魔液所以他们没办法逃出来

样例解释3

D和R还可以是0或者负数。

数据范围与约定

40%的测试数据2<=H,W<=5

70%的测试数据2<=H,W<=100

100%的测试数据2<=H,W<=1000,|D|< H,|R|< W

题解
显而易见的建图跑最短路,与普通题目的区别是可以喝一次药水走捷径,那就在SPFA的dis数组增加一维,记录之前是否走过捷径即可。(比赛时数组开错RE了,只有90分)

代码

#include<bits/stdc++.h>
#define oo 100000000
#define ll long long
#define mod 1000000
#define N 50005
using namespace std;
inline int read()
{int x=0,f=1;char ch=getchar();while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();return x*f;
}
char ch[1005][1005];
int h,w,d,r,tot,dis[1000005][2],Head[1000005];
int ret[5000005],Next[5000005],len[5000005],q[1000005];
bool flag[1000005],med[5000005];
void ins(int u,int v,int l)
{tot++;ret[tot]=v;len[tot]=l;Next[tot]=Head[u];Head[u]=tot;
}
void SPFA()
{for (int i=1;i<=h*w;i++) dis[i][0]=dis[i][1]=oo;dis[1][0]=dis[1][1]=0;int H=0,tail=1;q[1]=1;flag[1]=1;while (H!=tail){H++;int u=q[H%mod];for (int i=Head[u];i;i=Next[i]){int v=ret[i];if (!med[i]){if (dis[u][0]+len[i]<dis[v][0]){dis[v][0]=dis[u][0]+len[i];if (!flag[v]){tail++;q[tail%mod]=v;flag[v]=1;}}if (dis[u][1]+len[i]<dis[v][1]){dis[v][1]=dis[u][1]+len[i];if (!flag[v]){tail++;q[tail%mod]=v;flag[v]=1;}}}else{if (dis[u][0]+len[i]<dis[v][1]){dis[v][1]=dis[u][0]+len[i];if (!flag[v]){tail++;q[tail%mod]=v;flag[v]=1;}}}}flag[u]=0;}
}
int main()
{h=read();w=read();d=read();r=read();for (int i=1;i<=h;i++)scanf("%s",ch[i]+1);for (int i=1;i<=h;i++){for (int j=1;j<=w;j++){if (ch[i][j]=='#') continue;int p=(i-1)*w+j;if (i!=h&&ch[i+1][j]!='#') ins(p,p+w,1);if (i!=1&&ch[i-1][j]!='#') ins(p,p-w,1);if (j!=w&&ch[i][j+1]!='#') ins(p,p+1,1);if (j!=1&&ch[i][j-1]!='#') ins(p,p-1,1);if (i+d>=1&&i+d<=h&&j+r>=1&&j+r<=w&&ch[i+d][j+r]!='#')ins(p,(i+d-1)*w+j+r,1),med[tot]=1;}}SPFA();if (dis[h*w][0]!=oo||dis[h*w][1]!=oo) printf("%d",min(dis[h*w][0],dis[h*w][1]));else printf("-1");return 0;
}

【洛谷P3818】小A和uim之大逃离 II相关推荐

  1. 洛谷P1373 小a和uim之大逃离

    P1373 小a和uim之大逃离 题目背景 小a和uim来到雨林中探险.突然一阵北风吹来,一片乌云从北部天边急涌过来,还伴着一道道闪电,一阵阵雷声.刹那间,狂风大作,乌云布满了天空,紧接着豆大的雨点从 ...

  2. 洛谷1373 小a和uim之大逃离

    https://www.luogu.org/problem/show?pid=1373 题目背景 小a和uim来到雨林中探险.突然一阵北风吹来,一片乌云从北部天边急涌过来,还伴着一道道闪电,一阵阵雷声 ...

  3. 洛谷1373小a和uim之大逃离

    题目背景 小a和uim来到雨林中探险.突然一阵北风吹来,一片乌云从北部天边急涌过来,还伴着一道道闪电,一阵阵雷声.刹那间,狂风大作,乌云布满了天空,紧接着豆大的雨点从天空中打落下来,只见前方出现了一个 ...

  4. 【题解】洛谷P1373 小a和uim之大逃离(dp 递推)

    题目背景 小a和uim来到雨林中探险.突然一阵北风吹来,一片乌云从北部天边急涌过来,还伴着一道道闪电,一阵阵雷声.刹那间,狂风大作,乌云布满了天空,紧接着豆大的雨点从天空中打落下来,只见前方出现了一个 ...

  5. 洛谷P1373 小a和uim之大逃离 动态规划

    题解 我们可以先简单的想一种状态,也就是dp[i][j][x][y][t]dp[i][j][x][y][t]dp[i][j][x][y][t],这是最暴力的. 当t=0t = 0t=0时,表示小a处于 ...

  6. 洛谷 1373 小a和uim之大逃离

    /* 很容易想到f[i][j][k][l][01] 表示到ij点 两个人得分为kl 01表示这一步谁走的 因为起点不同 路径不同 所以要枚举起点.. 时间复杂度 O(nmk*nmk) 空间复杂度 O( ...

  7. 洛古 P1373 小a和uim之大逃离

    P1373 小a和uim之大逃离 题目提供者lzn 标签 动态规划 洛谷原创 难度 提高+/省选- 题目背景 小a和uim来到雨林中探险.突然一阵北风吹来,一片乌云从北部天边急涌过来,还伴着一道道闪电 ...

  8. 小a和uim之大逃离,洛谷之提高历练地,动态规划TG.lv(1)(3-2)

    正题 第二题:小a和uim之大逃离 这题有点烦,但是我们可以从k入手,大小为k的魔瓶,可以装的容量为0到k,那么相当于我们每一次mod 一下k 就行了. 我们当然也可以从小a和小uim的魔瓶差入手,我 ...

  9. 洛谷 1373 dp 小a和uim之大逃离 良心题解

    洛谷 1373 dp 这题还不算太难,,当初看的时候不是很理解题意,以为他们会选择两条不同的路径,导致整体思路混乱 传送门 其实理解题意和思路之后还是敲了不短的时间,一部分身体原因再加上中午休息不太好 ...

最新文章

  1. 深度学习中的一些英文解释
  2. java性能保障技术_狙击P7!阿里大佬亲授“Java性能调优技术宝典”,太完整了!...
  3. 如何解决:“ UnicodeDecodeError:#39;ascii#39;编解码器无法解码字节”
  4. docker学习系列7 容器化Node项目
  5. C和C++数据结构相关概念
  6. c mysql 查不到数据_怎么检测不到MYSQL数据库的存在
  7. linux 之 getopt_long()
  8. 大话设计模式笔记 享元模式
  9. core java面试题_CoreJava基础面试题
  10. 安卓应用安全指南 4.3.1 创建/使用内容供应器 示例代码
  11. 计算机辅助药物设计中的分子动力学模拟
  12. 关于笔记本测试的面试准备 2021-10-11
  13. 关于PTC保险丝工作原理总结
  14. 串口接收完整一帧数据包的3种方法
  15. DSP TMS320C5509A 控制DDS AD9854芯片进行AM-MSK调制
  16. QEMU中TCG翻译流程
  17. java.lang.reflect.AccessibleObject
  18. 对C51单片机的初步认识
  19. 如何教书?谈谈我当助教的感想-顺便回忆一下大学
  20. [一分钟先生]于进才:绩效面谈的常用方法与技巧

热门文章

  1. Arduino-超声波测距仪-实现近距离蜂鸣器报警
  2. U3D里Humanoid动画系统问题与解决
  3. 齐博模板直接写mysql_齐博CMS使用教程系统安装.ppt
  4. 计算机操作系统-3-存储管理
  5. SELINUX+PASSWD实战
  6. ALSA子系统(七)------simple_card添加虚拟声卡
  7. 内存卡格式化了数据可以恢复吗?
  8. 【计算机科学】【2011.05】【含源码】微阵列数据的SVM分类与边缘距离分析
  9. Abnova ProteoScreen - 组织微阵列抗体详解
  10. 欧拉角表示以及万向节死锁