华为OD机试 - 最小矩阵宽度(2025A卷 200分)

最小矩阵宽度

真题目录: 点击去查看

2025A卷 200分题型

题目描述

给定一个矩阵,包含 N * M 个整数,和一个包含 K 个整数的数组。

现在要求在这个矩阵中找一个宽度最小的子矩阵,要求子矩阵包含数组中所有的整数。

输入描述

第一行输入两个正整数 N,M,表示矩阵大小。

接下来 N 行 M 列表示矩阵内容。

下一行包含一个正整数 K。

下一行包含 K 个整数,表示所需包含的数组,K 个整数可能存在重复数字。

所有输入数据小于1000。

输出描述

输出包含一个整数,表示满足要求子矩阵的最小宽度,若找不到,输出-1。

用例1

输入

2 5
1 2 2 3 1
2 3 2 3 2
3
1 2 3

### 华为OD算法题目——亲子游戏 #### 问题描述 在一个 \( N \times N \) 的二维矩阵中,宝宝和妈妈通过抽签决定各自的位置。地图上的每个格子可能含有不同数量的糖果或障碍物。具体来说: - `>=0` 表示该处拥有的糖果数目。 目标是在最短时间内让妈妈找到宝宝,并计算在此过程中能收集的最大糖果数[^4]。 #### 解决方案概述 为了求解此问题,可以采用广度优先搜索 (BFS),因为 BFS 能够有效地探索所有可能路径并记录最小步数下的最优解。对于每一个节点,除了保存当前坐标外还需要跟踪已获得的糖果总数以及移动次数。当首次抵达终点时即得到全局最优解。 #### Python实现代码 下面给出了一种基于队列的数据结构来执行标准宽度遍历的方法: ```python from collections import deque def max_candies(matrix, n): directions = [(0, 1), (1, 0), (-1, 0), (0, -1)] start_pos = None end_pos = None for i in range(n): for j in range(n): if matrix[i][j] == -3: start_pos = (i, j) elif matrix[i][j] == -2: end_pos = (i, j) queue = deque([(start_pos[0], start_pos[1], 0)]) visited = set([start_pos]) candies_collected = {start_pos: matrix[start_pos[0]][start_pos[1]]} while queue: x, y, steps = queue.popleft() if (x, y) == end_pos: return candies_collected[(x, y)] + 2 for dx, dy in directions: nx, ny = x + dx, y + dy if not (0 <= nx < n and 0 <= ny < n): continue next_cell_value = matrix[nx][ny] if next_cell_value >= -2 and (nx, ny) not in visited: new_candy_count = candies_collected.get((x,y)) or 0 if next_cell_value != -1: candies_collected.update({(nx, ny):new_candy_count + next_cell_value}) visited.add((nx, ny)) queue.append((nx, ny, steps + 1)) return -1 ``` 上述程序首先定位起点(`-3`) 和 终点 (`-2`) ,接着利用队列来进行层次化扩展直到遇到第一个匹配的目标位置为止;期间累积经过单元格内的正整数值作为获取到的糖数量总和。如果最终未能触及目的地,则返回 `-1` 表明不存在可行路线。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无限码力

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值