题解:蓝桥云课 3820 混境之地5
【题目来源】
蓝桥云课:1.混境之地5 - 蓝桥云课 (lanqiao.cn)
【题目描述】
小蓝有一天误入了一个混境之地。
好消息是:他误打误撞拿到了一张地图,并从中获取到以下信息:
1.混境之地是一个 \(n·m\) 大小的矩阵, 其中第 \(i\) 行第 \(j\) 列的的点\(h_{ij}\)表示第 \(i\) 行第 \(j\) 列的高度。
2.他现在所在位置的坐标为 \((A,B)\),而这个混境之地出口的坐标为 \((C,D)\),当站在出口时即表示可以逃离混境之地。
3.小蓝有一个喷气背包,使用时,可以原地升高 \(k\) 个单位高度。
坏消息是:
1.由于小蓝的体力透支,所以只可以往低于当前高度的方向走。
2.喷漆背包燃料不足,只可以最后使用一次。
小蓝可以往上下左右四个方向行走,不消耗能量。
小蓝想知道他能否逃离这个混境之地, 如果可以逃离这里, 输入Yes, 反之输出No。
【输入】
第 \(1\) 行输入三个正整数 \(n\),\(m\) 和 \(k\),\(n,m\) 表示混境之地的大小,\(k\) 表示使用一次喷气背包可以升高的高度。
第 \(2\) 行输入四个正整数 \(A,B,C,D\),表示小蓝当前所在位置的坐标,以及混境之地出口的坐标。
第 \(3\) 行至第 \(n+2\) 行,每行 \(m\) 个整数,表示混境之地不同位置的高度。
【输出】
输出数据共一行一个字符串:
- 若小蓝可以逃离混境之地, 则输出Yes。
- 若小蓝无法逃离混境之地,则输出No。
【输入样例】
5 5 30
1 1 5 5
3 20 13 12 11
19 17 33 72 10
12 23 12 23 9
21 43 23 12 2
21 34 23 12 1
【输出样例】
Yes
【算法标签】
《蓝桥云课 3820 混境之地5》 #思维# #DFS#
【代码详解】
from functools import lru_cache
@lru_cache(maxsize=None)
def dfs(x, y, z):
"""
坐标为(x, y),z表示是否使用过背包
return: 返回True表示能够逃离,False表示不能
"""
if x==C and y==D:
return True
#如果没走到终点,那就四个方向判断:
for delta_x, delta_y in [(1,0), (0,1), (-1,0), (0,-1)]:
xx, yy = x + delta_x, y+delta_y
#新坐标:不能越界
if xx<0 or xx>=n or yy<0 or yy>=m:
continue
#如果新坐标比旧坐标低,那就能够走到新坐标(xx,yy)
if Map[xx][yy] < Map[x][y]:
if dfs(xx, yy, z):
return True
#在(x,y)处使用喷漆背包
elif z == False and Map[xx][yy]<Map[x][y]+k:
if dfs(xx, yy, True):
return True
return False
n, m, k = map(int, input().split())
A, B, C, D = map(int, input().split())
A, B, C, D = A-1, B-1, C-1, D-1
Map = []
for i in range(n):
Map.append(list(map(int, input().split())))
if dfs(A, B, False):
print("Yes")
else:
print("No")
【运行结果】
5 5 30
1 1 5 5
3 20 13 12 11
19 17 33 72 10
12 23 12 23 9
21 43 23 12 2
21 34 23 12 1
Yes
浙公网安备 33010602011771号