news 2026/11/2 16:12:41

华为OD机试真题2025双机位C卷 PythonJS 实现【自动泊车】

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
华为OD机试真题2025双机位C卷 PythonJS 实现【自动泊车】

目录

题目

思路

Code


题目

题目描述

在某商场的地下停车场,部署了一套智能导航系统。停车场可以看作是一个 r*c 的网格矩阵,其中:

  • 0 表示该位置是空的行车道,车辆可以通行。
  • 1 表示该位置存有障碍物、立柱或其他已停放的车辆,车辆无法通行。

停车场的入口统一设在坐标 [0, 0] 处。现在有一辆车进入停车场,需要前往指定的目标车位 [m, n]。

车辆在停车场内只能沿着上、下、左、右四个方向移动,每移动一个格子计为步数 1。请你帮车主规划一条从入口到目标车位的最短路径。

输入描述
  1. 第一行输入两个整数 m 和 n,表示目标车位的行下标和列下标。
  2. 第二行输入两个整数 row 和 col,表示停车场的总行数和总列数。
  3. 接下来的 row 行,每行包含 col 个以空格分隔的整数(0 或 1),表示停车场的状态信息。

约束条件:

  • 1 < row, col < 200
  • 0 < m < row, 0 < n < col
  • 入口 [0, 0] 保证为空位。
输出描述
  • 输出一个整数,表示从入口 [0, 0] 到目标车位 [m, n] 的最短路径步数。
  • 如果由于障碍物阻挡无法到达目标位置,则输出 -1。

示例 1

输入:

1 1

3 3

0 0 0

0 0 0

0 0 0

输出:

2

说明:

停车场大小为 3x3,目标位置在 [1, 1]。

最短路径序列可为:[0, 0] -> [0, 1] -> [1, 1],共移动 2 步。

或者:[0, 0] -> [1, 0] -> [1, 1],共移动 2 步。


示例 2

输入:

2 2

3 3

0 1 0

1 1 0

0 0 0

输出:

-1

说明:

由于入口 [0, 0] 的右边 [0, 1] 和下边 [1, 0] 均为障碍物(1),车辆被困在入口处,无法到达目标位置 [2, 2],因此输出 -1。


示例 3

输入:

0 2

3 3

0 0 0

1 1 0

0 0 0

输出:

2

说明:

目标位置在 [0, 2]。虽然中间有障碍物,但可以沿着第一行直接向右行驶:[0, 0] -> [0, 1] -> [0, 2],步数为 2。

思路

  • 寻找最短路径的最佳算法是 广度优先搜索 (BFS)。BFS 能够保证最先到达目标点的路径一定是最短的。
  • 核心步骤:首先进行合法性校验:首先检查起点 [0, 0] 或目标点 [m, n] 是否为障碍物(1)。如果是,直接返回 -1。
  1. 初始化:创建一个队列,存放当前探索到的坐标和步数 (x, y, step)。起始放入 (0, 0, 0)。
  2. 防重访问:创建一个 visited 矩阵(或直接修改原矩阵),记录已经走过的位置,避免死循环。
  3. 循环搜索:
  • 从队列中弹出队首元素。
  • 判断是否到达目标点,如果是,返回当前步数。
  • 向四个方向(上下左右)扩散,检查新坐标是否在矩阵边界内、是否是通道(0)、且未被访问。
  • 满足条件的坐标入队,并标记为已访问。
  • 终点不可达:如果队列为空仍未找到目标点,则说明路径不通,返回 -1。

Code

import sys from collections import deque def solve(): # 1. 读取目标位置 m (行), n (列) line1 = sys.stdin.readline().split() m, n = map(int, line1) # 2. 读取停车场大小 row (总行数), col (总列数) line2 = sys.stdin.readline().split() row, col = map(int, line2) # 3. 读取停车场矩阵信息 matrix = [] for _ in range(row): matrix.append(list(map(int, sys.stdin.readline().split()))) # --- 边界条件预检查 --- # 如果终点是障碍物(1),则无法通达 if matrix[m][n] == 1: print("-1") return # 如果起点就是终点 if m == 0 and n == 0: print("0") return # --- BFS 核心逻辑 --- # 队列中存储元素:(x坐标, y坐标, 当前步数) queue = deque([(0, 0, 0)]) # 使用矩阵记录已访问位置,防止重复访问 visited = [[False for _ in range(col)] for _ in range(row)] visited[0][0] = True # 定义四个移动方向:上、下、左、右 directions = [(-1, 0), (1, 0), (0, -1), (0, 1)] while queue: curr_r, curr_c, dist = queue.popleft() # 尝试向四个方向移动 for dr, dc in directions: nr, nc = curr_r + dr, curr_c + dc # 检查:坐标是否越界 if 0 <= nr < row and 0 <= nc < col: # 检查:是否是车位(0) 且 未访问过 if matrix[nr][nc] == 0 and not visited[nr][nc]: # 检查:是否到达目标位置 if nr == m and nc == n: print(dist + 1) return # 标记访问并入队 visited[nr][nc] = True queue.append((nr, nc, dist + 1)) # 如果遍历结束仍未到达目标位置 print("-1") if __name__ == "__main__": solve()

JS

const fs = require('fs'); function solve() { const input = fs.readFileSync(0, 'utf8').split(/\s+/); let cur = 0; // 1. 读取目标位置 m (行), n (列) const m = parseInt(input[cur++]); const n = parseInt(input[cur++]); // 2. 读取停车场大小 row (总行数), col (总列数) const row = parseInt(input[cur++]); const col = parseInt(input[cur++]); // 3. 读取停车场矩阵信息 const matrix = []; for (let i = 0; i < row; i++) { let r_data = []; for (let j = 0; j < col; j++) { r_data.push(parseInt(input[cur++])); } matrix.push(r_data); } // --- 边界条件预检查 --- // 如果终点是障碍物(1),则无法通达 if (matrix[m][n] === 1) { console.log("-1"); return; } // 如果起点就是终点 if (m === 0 && n === 0) { console.log("0"); return; } // --- BFS 核心逻辑 --- // 队列中存储元素:(x坐标, y坐标, 当前步数) let queue = [[0, 0, 0]]; // 使用矩阵记录已访问位置,防止重复访问 let visited = Array.from({ length: row }, () => Array(col).fill(false)); visited[0][0] = true; // 定义四个移动方向:上、下、左、右 const directions = [[-1, 0], [1, 0], [0, -1], [0, 1]]; let head = 0; while (head < queue.length) { let [curr_r, curr_c, dist] = queue[head++]; // 尝试向四个方向移动 for (let [dr, dc] of directions) { let nr = curr_r + dr; let nc = curr_c + dc; // 检查:坐标是否越界 if (nr >= 0 && nr < row && nc >= 0 && nc < col) { // 检查:是否是车位(0) 且 未访问过 if (matrix[nr][nc] === 0 && !visited[nr][nc]) { // 检查:是否到达目标位置 if (nr === m && nc === n) { console.log(dist + 1); return; } // 标记访问并入队 visited[nr][nc] = true; queue.push([nr, nc, dist + 1]); } } } } // 如果遍历结束仍未到达目标位置 console.log("-1"); } solve();

【华为od机试真题Python+JS+Java+Go合集】【超值优惠】:Py/JS/Java/Go合集

【华为od机试真题Python】:Python真题题库

【华为od机试真题JavaScript】:JavaScript真题题库

【华为od机试真题Java&Go】:Java&Go真题题库

【华为od机试真题C++】:C++真题题库

【华为od机试真题C语言】:C语言真题题库

【华为od面试手撕代码题库】:面试手撕代码题库

【华为od机试面试交流群:830285880】【文章底部有二维码链接,可扫码加交流群】

华为OD机试:二本院校有机会吗?
有机会,但不大,大神除外!机考分数越高越好,所以需要提前刷题。机考通过后,如果没有收到面试邀请,也不要着急,非目标院校面试邀请发的时间比较晚。非目标院校今年有点难,机试至少要考到350分,所以需要疯狂刷题,华为OD机考是有题库的,最好在考前完所有题库题目。华为OD机试:跨专业可以参加华为OD可以,但是如果你的本科院校比较差,上岸概率不大。华为OD机试:华为OD简历被锁定机试通过,性格测试也通过,但是没人联系面试,发现简历被锁定。此时需要主动去联系HR。让他帮助你查询原因。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/11/2 3:56:58

C语言如何实现工业设备实时控制?掌握这5大核心技术就够了

第一章&#xff1a;C语言在工业实时控制中的核心地位在工业自动化与实时控制系统中&#xff0c;C语言长期占据主导地位。其高效性、可预测性和对硬件的直接操控能力&#xff0c;使其成为嵌入式控制器、PLC&#xff08;可编程逻辑控制器&#xff09;和实时操作系统&#xff08;R…

作者头像 李华
网站建设 2026/11/2 3:56:50

收藏!35岁程序员转行大模型领域:8步落地指南

对于35岁的程序员而言&#xff0c;职业转型虽有挑战&#xff0c;但大模型作为当下科技领域的核心风口&#xff0c;无疑是值得把握的新机遇。相较于年轻从业者&#xff0c;35岁程序员具备更丰富的项目经验和问题解决能力&#xff0c;这些优势在转行过程中可充分发挥。以下是经过…

作者头像 李华
网站建设 2026/11/2 2:54:21

Captura音频位深度转换完全指南:从基础到实战的终极技巧

Captura音频位深度转换完全指南&#xff1a;从基础到实战的终极技巧 【免费下载链接】Captura Capture Screen, Audio, Cursor, Mouse Clicks and Keystrokes 项目地址: https://gitcode.com/gh_mirrors/ca/Captura 你是否曾经遇到过这样的困扰&#xff1a;录制的音频在…

作者头像 李华
网站建设 2026/11/2 2:54:37

Git revert撤销错误的TensorFlow代码提交

Git Revert 撤销错误的 TensorFlow 代码提交 在一次深夜调试模型训练脚本时&#xff0c;你终于完成了新模块的集成&#xff0c;兴奋地执行 git commit -m "Update model config with TF 2.9 features" 并推送到主分支。几分钟后&#xff0c;CI 流水线炸了——构建失败…

作者头像 李华
网站建设 2026/11/1 4:31:59

Proteus与Keil联调STM32仿真操作指南

从零开始&#xff1a;用Proteus与Keil搭建STM32仿真调试环境 你有没有遇到过这样的情况——项目刚起步&#xff0c;PCB还没打样回来&#xff0c;但老板已经催着要看到LED闪烁&#xff1f;或者你是高校学生&#xff0c;实验室设备有限&#xff0c;想动手却无板可用&#xff1f;又…

作者头像 李华