华为OD-2024年E卷-小明周末爬山[200分] -- python
问题描述:
题目描述
周末小明准备去爬山锻炼,0代表平地,山的高度使用1到9来表示,小明每次爬山或下山高度只能相差k及k以内,每次只能上下左右一个方向上移动一格,小明从左上角(0,0)位置出发
输入描述
第一行输入m n k(空格分隔),代表m*n的二维山地图,k为小明每次爬山或下山高度差的最大值。
然后接下来输入山地图,一共m行n列,均以空格分隔。取值范围:0<m≤500,0<n≤500,0<k<5
输出描述
请问小明能爬到的最高峰多高,到该最高峰的最短步数,输出以空格分隔。同高度的山峰输出较短步数。如果没有可以爬的山峰,则高度和步数都返回0。
备注
所有用例输入均为正确格式,且在取值范围内,考生不需要考虑不合法的输入格式。
5 4 1
0 1 2 0
1 0 0 0
1 0 1 2
1 3 1 0
0 0 0 9
2 2
解题思路:
需要得到小明能爬到的最高峰多高,到该最高峰的最短步数。两个限制条件,一个最大值、一个最小步数,考虑bfs:
- arr列表,记录山地图;vis列表,记录当前位置是否访问过;ans列表,记录高度和步数
- q列表,加入(0,0,0)初始化,遍历四个方向
- 符合条件:将下一个坐标加入q,并更新下一坐标vis为1,同时将当前高度、步数加入ans列表
- 对ans列表按照高度降序、步数升序排列
代码实现:
#处理输入
m,n,k = map(int,input().split())
arr = []
for i in range(m):arr.append(list(map(int,input().split())))
#初始化坐标(0,0)
dir = [(1,0),(-1,0),(0,1),(0,-1)]
vis = [[0]*n for _ in range(m)]
vis[0][0] = 1
ans = []
ans.append((0,0))
q = []
q.append((0,0,0))
#遍历地图
while q:(x,y,step) = q.pop()for (i,j) in dir:dx = x+idy = y+jif 0 <= dx < m and 0 <= dy < n and not vis[dx][dy]:if abs(arr[dx][dy] - arr[x][y]) <= k:q.append((dx,dy,step+1))vis[dx][dy] = 1ans.append((arr[dx][dy],step+1))
ans.sort(key = lambda x: (-x[0],x[1]))#默认升序,'-' 代表降序
print(ans[0][0],ans[0][1],sep = ' ')