题解:蓝桥云课 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
posted @ 2026-03-04 15:21  团爸讲算法  阅读(0)  评论(0)    收藏  举报