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

华为0528笔试

第三题

题目

给定一个二维数组 mountainMap 表示一座山的地图,数组中的每个元素 mountainMap[x][y] 代表坐标 (x, y) 处山的高度。登山员从山底出发,爬到山峰。
山底的含义:mountainMap中高度为0的坐标点。
山峰的含义:mountainMap中高度最高的坐标点。
登山员每次移动只能从当前位置向上下左右四个方向移动一格,向高处移动时,移动到的位置山的高度不能高于当前位置的高度加上固定的攀登能力值climbAbility;向低处移动时,移动到的位置的山的高度不能低于当前位置山的高度减去climbAbility。

变量取值范围:
climbAbility:[1,30]
山峰高度:[0,100]
mountainMap的行数mountainMapRows:[2,1000]
mountainMap的列数mountainMapCols:[2,1000]

请计算出从山底移动到山峰,最少需要移动几次?

解答要求:时间限制: C/C++ 1000ms,其他语言: 2000ms 内存限制: C/C++ 256MB,其他语言: 512MB

输入格式
第一行为climbAbility的值
第二行为mountainMapRows mountainMapCols
从第三行开始为mountainMapRows行mountainMapCols列的高度二维数组mountainMap[mountainMapRows][mountainMapCols],每行的高度数字中间用空格分割
输出格式
从山底移动到山峰,最少移动次数。 如果无法移动至山峰,则输出-1

示例1
输入
2
3 2
1 3
0 4
5 3

输出5
解释
攀登能力为2,3行2列的山峰坐标,山底的坐标为(1,0)高度0,山峰的坐标为(2,0)高度5。仅有一条路线 初始位置山底(1,0)高度0->(0,0)高度1->(0,1)高度3->(1,1)高度4->(2,1)高度3->(2,0)高度5 共需要移动5次

示例2
输入1
4 5
1 1 1 1 1
1 0 1 2 1
1 1 1 3 1
1 1 1 1 1
输出3
解释
攀登能力为1,4行5列的山峰坐标,山底的坐标为(1,1),山峰的坐标为(2,3)。 最短路线为 初始位置山底(1,1)高度0->(1,2)高度1->(1,3)高度2->山峰(2,3)高度3 共需要移动3次

示例3
输入1
4 5
1 1 1 1 1
1 0 1 2 1
1 1 1 0 1
1 1 1 1 1
输出-1

解释
无法达到山峰,输出-1

代码

package main.huawei;import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;/*** @ClassName MountainGraph* @Description 华为0528笔试题* @Author Feng* @Date 2025/6/9**/
public class MountainGraph {private static int[][] DIRECTIONS = {{-1,0},{1,0},{0,-1},{0,1}};public static void main(String[] args) {Scanner sc = new Scanner(System.in);int climbAblity = sc.nextInt();int rows = sc.nextInt();int cols = sc.nextInt();sc.nextLine();int[][] mountain = new int[rows][cols];int[] bottom = null;int[] peak = null;int maxHeight = -1;for (int i = 0; i < rows; i++) {String[] line = sc.nextLine().split(" ");for (int j = 0; j < cols; j++) {mountain[i][j] = Integer.parseInt(line[j]);// 找到谷底if (mountain[i][j] == 0) {bottom = new int[]{i, j};}// 找到山顶if (mountain[i][j] > maxHeight) {maxHeight = mountain[i][j];peak = new int[]{i, j};}}}// 计算从谷底到山顶的最短路径int min = minPath(climbAblity, mountain, bottom, peak, maxHeight);System.out.println("min = " + min);}/*** 计算从山谷到山顶的最短路径**/private static int minPath(int climbAblity, int[][] mountain, int[] bottom, int[] peak, int maxHeight) {// 用于标识每个节点是否已经访问过boolean[][] visited = new boolean[mountain.length][mountain[0].length];Queue<int[]> queue = new LinkedList<>();// 将起始节点加入队列, 并标记为已访问queue.offer(new int[]{bottom[0], bottom[1], 0}); // {row, col, steps}visited[bottom[0]][bottom[1]] = true;while (!queue.isEmpty()) {// 取出队首节点int[] current = queue.poll();int row = current[0];int col = current[1];int steps = current[2];// 如果当前节点为山顶,返回步数if (row == peak[0] && col == peak[1]) {return steps;}// 遍历四个方向for (int[] dir : DIRECTIONS) {int newRow = row + dir[0];int newCol = col + dir[1];// 检查新位置是否越界if (newRow >= 0 && newRow < mountain.length && newCol >= 0 && newCol < mountain[0].length){int nextHeight = mountain[newRow][newCol];if (!visited[newRow][newCol] && nextHeight <= climbAblity+mountain[row][col] &&nextHeight >= mountain[newRow][newCol]-climbAblity) {visited[newRow][newCol] = true;queue.offer(new int[]{newRow, newCol, steps + 1});}}}}// 若不存在最短路径,则返回-1return -1;}
}

最少步数问题,使用bfs算法来寻找从山底到山峰的最短路径。 主要思路是: 读取输入数据并找到山底和山峰的坐标 初始化 BFS 队列,从山底开始搜索 每次从队列中取出当前位置,检查四个方向的可能移动 若移动符合高度差限制且未访问过,则加入队列继续搜索 找到山峰时立即返回步数,若队列为空仍未找到则返回 - 1 时间复杂度:O (m*n)

http://www.xdnf.cn/news/13097.html

相关文章:

  • 剑指offer20_链表中环的入口节点
  • 408第一季 - 数据结构 - 折半查找与二叉排序树
  • Java面向对象思想以及原理以及内存图解
  • 【大模型】RankRAG:基于大模型的上下文排序与检索增强生成的统一框架
  • while/do while/for循环几个小细节
  • Android Native 之 lmkd进程和kernel kswapd的关联
  • 树突状细胞与肿瘤
  • 在Mathematica环境中做数值实验来观察逻辑映射的复杂度
  • SPI Flash开发全解(基于GD25Qxx)
  • 选取货物 - 题解(0-1背包问题)
  • Ⅳ.计算机二级选择题(函数)
  • IP选择注意事项
  • #Vue3篇:透传 Attributes---$attrs插槽propemit
  • Java并发编程实战 Day 15:并发编程调试与问题排查
  • 力扣-20.有效的括号
  • 多进程通信之共享内存
  • 0,freeRTOS基础知识
  • SpringBoot API接口签名(防篡改)
  • win11 找不到 GPEDIT.MSC Win11找不到gpedit.msc怎么办?Win11提示缺少gpedit.msc文件怎么办???
  • PyCharm 和 Anaconda 搭建Python环境【图文教程】
  • 32位寻址与64位寻址
  • 轻量级屏蔽文件管理方案
  • Ascend NPU上适配Step1X-Edit模型
  • 线程池与并发工具:让并发编程更简单、高效!
  • CodeRider 2.0 体验手记:当 AI 编程照进现实,颠覆想象的开发之旅
  • 【51单片机】4. 模块化编程与LCD1602Debug
  • 中国大学本科专业采用‌学科门类—专业类—具体专业‌三级体系
  • 【DAY44】预训练模型
  • sql语句执行流程
  • 指令管理—弹幕/礼物/快捷键—抖音直播伴侣—使用教程