荆轲刺秦王[bandit]|题解

荆轲期秦王[bandit]

题目描述

时隔数年,刺客荆轲再次来到咸阳宫,试图刺杀嬴政。
咸阳宫的地图可以描述为一个 n 行 m 列的矩形。在这里,我们规定每一行中从左到右为 x 轴正方 向,每一列中从下到上为 y 轴正方向,左下角的点坐标为 (1,1)。矩形中的点可以分为 4 种:

  1. 起点,也就是荆轲的所在点,在地图中用字符"S"代表。
  2. 终点,也就是嬴政的所在点,在地图中用字符"T"代表。
  3. 卫兵,在地图中用一个正整数 ai,j 代表。在这里,一个卫兵 (i, j) 可以观察到与他曼哈顿距离小 于 ai,j 的点。也就是卫兵 (i, j) 可以观察到所有满足 ∣x − i∣ + ∣y − j∣ < ai,j 的点 (x, y)。
  4. 空地,在地图中用字符"."代表。

荆轲的正常移动方式为每秒向八连通的任意方向前进一格。如下图,中间的点为荆轲当前所在点,每 一秒,他可以走向其余的八个点。

需要注意的是,正常移动时,荆轲不能踏进任何一个有卫兵或者卫兵能观察到的格子。当然,他也不 能走出咸阳宫,也就是说,无论何时,荆轲的坐标 (x, y) 都必须满足 1 ≤ x ≤ m 且 1 ≤ y ≤ n。

荆轲还有两种技能:隐身和瞬移。

  1. 隐身:下一秒荆轲进入隐身状态,卫兵观察不到荆轲,荆轲可以进入卫兵的观察范围内,但仍然 不能进入卫兵所在的格子。注意这个状态只能维持一秒。
  2. 瞬移:荆轲下一秒移动的距离改为 d,但这时只能向上下左右四个方向移动。即可以移动到(x + d, y),(x − d, y),(x, d + y),(x, d − y)。

在本题中,两种技能可以同时使用,而且不考虑冷却时间,即一次用完可以立即用下一次,两种技能 都分别有使用次数限制,你也可以不用完所有次数。

现在给出咸阳城的地图,请计算荆轲到达秦王所在点所需的最短时间。此外,在所用时间相同情况 下,荆轲希望使用的两种技能总次数尽可能少;在所用时间与技能次数相同情况下,荆轲希望使用的隐身次数尽可能少。

输入格式

第一行五个整数 n, m, c1, c2, d,代表地图的大小为 n × m,隐身的使用限制次数为 c1,瞬移的使用 限制次数为 c2 和一次瞬移的距离为 d。
接下来 n 行,每行 m 个元素。每个元素为字符"S"、“T”、"."或者一个正整数 ai,j ,代表一个格点,具 体含义详见题目描述。

输出格式

若荆轲无法到达秦王所在点,则输出一行一个 -1。
否则输出一行三个整数 t, u1, u2 ,依次代表所需的最短时间,隐身的使用次数与瞬移的使用次数。

样例1输入

5 4 0 0 5

. 1 T 1
. . . 2
. 1 . .
S . . .
1 . . .

样例1输出

3 0 0

样例1解释

起点为 (1, 2),荆轲可以依次走到 (1, 3), (2, 4), (3, 5) 到达终点。

样例2输入

8 6 2 3 3

. S . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
2 . 2 . 2 .
. . 1 . T .
3 . 1 . . 3

样例2输出

3 1 3

样例2解释

起点为 (2, 8),荆轲可以依次走到 (2, 5), (2, 2), (5, 2),需要注意的是,即使最后一步到达终点,但 因为终点在卫兵的观察范围之内,所以仍然需要隐身进入。

样例3输入

8 6 5 5 2

. S . . . .
. . . . . .
. . . . . .
1 1 3 2 .
1 2 3 2 2
1 3 3 2 4
1 4 3 2 6
1 5 T 2 8
1 6 3 2 10

样例3输出

-1


解题思路

主要方法:搜索+记忆化+差分

  • dp[x][y][l1][l2]

  • 差分

  • b[i][s]+=1

  • b[i][t+1]-=1


总结

  • 考察了多重循环/搜索/记忆化
  • 考察了差分
  • 考察了审题、细节处理

出处:中国计算机学会


此博客为转载文章
非原创

有问题可以在下边提出来记得

@Y_bluefat

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值