螺旋数字矩阵 - 华为OD统一考试

华为OD机考中的一道题目,要求根据数字个数n和行数m,按照顺时针螺旋填充的方式创建矩阵。本文详细解析了如何用Java、Python和C++实现这一算法,并提供了相关练习题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

OD统一考试(C卷)

分值: 100分

题解: Java / Python / C++

alt

题目描述

疫情期间,小明隔离在家,百无聊赖,在纸上写数字玩。他发明了一种写法:

给出数字个数n行数m (0 < n <= 999,0 < m <= 999),从左上角的1开始,按照顺时针螺旋向内写方式,依次写出2,3…n,最终形成一个m行矩阵。

小明对这个矩阵有些要求:

  1. 每行数字的个数一样多
  2. 列的数量尽可能少
  3. 填充数字时优先填充外部
  4. 数字不够时,使用单个*号占位

输入描述

两个整数,空格隔开,依次表示n、m

输出描述

符合要求的唯一矩阵

示例1

输入:
9 4

输出:
1 2 3
* * 4
9 * 5
8 7 6

说明:
9个数字写成4行,最少需要3列

示例

### 螺旋数字矩阵的实现 螺旋数字矩阵是一种常见的编程问题,通常涉及二维数组的操作以及边界条件的处理。以下是基于C++语言的一个具体实现方案。 #### 1. 输入解析 程序需要接收两个输入参数:`n` `m`,分别表示总数字数量矩阵行数。通过计算可以得出列数 `k = ceil(n / m)`[^1]。这一步确保了矩阵能够容纳所有的数字。 #### 2. 矩阵初始化 创建一个大小为 `m * k` 的二维数组用于存储结果。初始状态下,所有位置均为空白或设置为默认值(如 `-1` 或其他标志位)。 ```cpp #include <iostream> #include <vector> using namespace std; int main() { int n, m; cin >> n >> m; // 接收输入 int rows = m; int cols = (n + m - 1) / m; // 计算列数 vector<vector<int>> matrix(rows, vector<int>(cols, 0)); // 初始化变量 int top = 0, bottom = rows - 1, left = 0, right = cols - 1; int num = 1; while (num <= n && top <= bottom && left <= right) { // 填充顶部行 for (int i = left; i <= right && num <= n; ++i) { matrix[top][i] = num++; } top++; // 填充右侧列 for (int i = top; i <= bottom && num <= n; ++i) { matrix[i][right] = num++; } right--; // 填充底部行 if (top <= bottom) { // 防止越界 for (int i = right; i >= left && num <= n; --i) { matrix[bottom][i] = num++; } bottom--; } // 填充左侧列 if (left <= right) { // 防止越界 for (int i = bottom; i >= top && num <= n; --i) { matrix[i][left] = num++; } left++; } } // 输出结果 for (const auto& row : matrix) { for (const auto& val : row) { cout << val << "\t"; } cout << endl; } return 0; } ``` #### 3. 边界控制逻辑 为了完成螺旋填充操作,定义四个指针来标记当前未被访问区域的上下左右边界 (`top`, `bottom`, `left`, `right`)。每次填充完成后调整对应边界的范围,直到所有数字都被填入或者达到指定的最大行列限制为止[^1]。 #### 4. 时间复杂度分析 该算法的时间复杂度主要由两部分构成:一是构建矩阵的过程 O(m*k),二是遍历并填充矩阵中的每一个单元格 O(n)[^1]。因此整体时间复杂度接近于线性级别即 O(max(n,m*k))。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

什码情况

你的鼓励就是我最大的动力。

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

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

打赏作者

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

抵扣说明:

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

余额充值