当前位置: 首页 > news >正文

华为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:

  1. arr列表,记录山地图;vis列表,记录当前位置是否访问过;ans列表,记录高度和步数
  2. q列表,加入(0,0,0)初始化,遍历四个方向
  3. 符合条件:将下一个坐标加入q,并更新下一坐标vis为1,同时将当前高度、步数加入ans列表
  4. 对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 = ' ')

相关文章:

  • 【计算机网络】——reactor模式高并发网络服务器设计
  • Number.toFixed() 与 Math.round() 深度对比解析
  • [IMX][UBoot] 03.顶层 Makefile 解析
  • 电磁场与电磁波篇---梯度散度旋度
  • 频响函数(FRF)
  • kicad运行时出错,_Pnext->_Myproxy = nullptr;访问内存出错解决措施
  • 分割函数(Split Function)
  • Druid 连接池详解
  • SQL Server从入门到项目实践(超值版)读书笔记 17
  • 40-Oracle 23 ai Bigfile~Smallfile-Basicfile~Securefile矩阵对比
  • 性能优化 - 高级进阶:JVM 常见优化参数
  • useMemo vs useCallback:React 性能优化的两大利器
  • 2024 提高寒假第一轮第四题:铁路建设
  • Uncaught (in promise) TypeError: x.isoWeek is not a function
  • 华为云国际版有区块链吗
  • 量化面试绿皮书:14. 钟表零件
  • Qt QComboBox下拉多选
  • Node.js 中常用的异步函数讲解、如何检测异步操作时间和事件
  • 「Matplotlib 入门指南」 Python 数据可视化分析【数据分析全栈攻略:爬虫+处理+可视化+报告】
  • 数据库相关操作
  • 那些论坛网站做的比较好/seo专员工作内容
  • 手机网站怎么设置成电脑版的/seo文章优化方法
  • 鞍山哪里做网站/最新新闻热点话题
  • 武汉公司注册网站/知乎seo排名帝搜软件
  • 重庆秀山网站建设公司/国际新闻网
  • 网站建设可以帮助花店怎么样/苏州疫情最新情况