news 2026/5/1 9:50:11

C++:填充环形矩阵(附带源码)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++:填充环形矩阵(附带源码)

项目背景详细介绍

在算法学习与 C++ 基础训练中,矩阵类问题始终占据着非常重要的位置。

其中,环形矩阵(也称螺旋矩阵、蛇形矩阵)填充问题,几乎是所有算法课程、面试、竞赛中的“常青题”,例如:

  • LeetCode 螺旋矩阵

  • 剑指 Offer 顺时针打印矩阵

  • 各类笔试中的二维数组操作题

该类问题的特点是:

  • 看似简单

  • 实现细节多

  • 边界条件复杂

  • 非常容易写错

而一旦你真正掌握了环形矩阵的填充思路,你会发现:

  • 所有二维遍历问题都有统一模型

  • “控制边界”是核心思想

  • 算法思维与工程代码高度统一

在实际工程与教学中,该问题具有极高价值:

  • 训练逻辑思维能力

  • 强化数组 / vector 使用

  • 锻炼边界条件控制能力

  • 为更复杂图像处理、网格算法打基础

因此,本项目的目标是:

用一套清晰、稳定、可复用的 C++ 实现方案,完整讲解环形矩阵填充算法

并且做到:

  • 思路清晰

  • 代码可直接运行

  • 适合博客讲解与课堂演示


项目需求详细介绍

1. 功能需求

  1. 使用 C++ 填充 N × N 的环形矩阵

  2. 支持顺时针填充

  3. 支持逆时针填充(扩展)

  4. 数值从 1 连续递增

  5. 正确处理奇偶维度

2. 技术要求

  1. 使用std::vector存储矩阵

  2. 不依赖任何第三方库

  3. 算法复杂度为 O(N²)

  4. 代码结构清晰、可读性强

3. 教学与工程要求

  1. 明确“边界收缩”思想

  2. 每一层(环)逻辑清晰

  3. 避免重复填充

  4. 可轻松改造为打印 / 遍历算法


相关技术详细介绍

1. 什么是环形矩阵

环形矩阵是指:

按照一圈一圈(从外到内)的方式,对二维矩阵进行遍历或填充

典型形式包括:

  • 顺时针螺旋

  • 逆时针螺旋


2. 核心思想:边界控制

整个算法的核心只有一个:

使用四个边界变量,逐步向内收缩

通常使用:

  • top:上边界

  • bottom:下边界

  • left:左边界

  • right:右边界


3. 时间与空间复杂度

  • 时间复杂度:O(N²)

  • 空间复杂度:O(N²)(用于存储矩阵)


实现思路详细介绍

本项目采用最经典、最稳定的边界收缩法,实现流程如下:

  1. 初始化矩阵

  2. 初始化四个边界

  3. top <= bottom && left <= right条件下循环

  4. 每一轮填充一“环”:

    • 从左到右

    • 从上到下

    • 从右到左

    • 从下到上

  5. 每完成一条边,收缩对应边界

该方法:

  • 不依赖复杂判断

  • 适用于任意 N

  • 是所有螺旋矩阵问题的通用模板


完整实现代码

/**************************************************** * File: SpiralMatrix.h ****************************************************/ #pragma once #include <vector> class SpiralMatrix { public: static std::vector<std::vector<int>> fillClockwise(int n); static std::vector<std::vector<int>> fillCounterClockwise(int n); }; /**************************************************** * File: SpiralMatrix.cpp ****************************************************/ #include "SpiralMatrix.h" std::vector<std::vector<int>> SpiralMatrix::fillClockwise(int n) { std::vector<std::vector<int>> matrix(n, std::vector<int>(n, 0)); int top = 0, bottom = n - 1; int left = 0, right = n - 1; int value = 1; while (top <= bottom && left <= right) { // 从左到右 for (int col = left; col <= right; col++) matrix[top][col] = value++; top++; // 从上到下 for (int row = top; row <= bottom; row++) matrix[row][right] = value++; right--; // 从右到左 if (top <= bottom) { for (int col = right; col >= left; col--) matrix[bottom][col] = value++; bottom--; } // 从下到上 if (left <= right) { for (int row = bottom; row >= top; row--) matrix[row][left] = value++; left++; } } return matrix; } std::vector<std::vector<int>> SpiralMatrix::fillCounterClockwise(int n) { std::vector<std::vector<int>> matrix(n, std::vector<int>(n, 0)); int top = 0, bottom = n - 1; int left = 0, right = n - 1; int value = 1; while (top <= bottom && left <= right) { // 从上到下 for (int row = top; row <= bottom; row++) matrix[row][left] = value++; left++; // 从左到右 for (int col = left; col <= right; col++) matrix[bottom][col] = value++; bottom--; // 从下到上 if (left <= right) { for (int row = bottom; row >= top; row--) matrix[row][right] = value++; right--; } // 从右到左 if (top <= bottom) { for (int col = right; col >= left; col--) matrix[top][col] = value++; top++; } } return matrix; } /**************************************************** * File: main.cpp ****************************************************/ #include "SpiralMatrix.h" #include <iostream> void printMatrix(const std::vector<std::vector<int>>& matrix) { for (const auto& row : matrix) { for (int v : row) std::cout << v << "\t"; std::cout << std::endl; } } int main() { int n = 5; std::cout << "顺时针填充:" << std::endl; auto clockwise = SpiralMatrix::fillClockwise(n); printMatrix(clockwise); std::cout << "\n逆时针填充:" << std::endl; auto counter = SpiralMatrix::fillCounterClockwise(n); printMatrix(counter); return 0; }

代码详细解读(仅解读方法作用)

fillClockwise

按照顺时针方向,使用边界收缩法填充矩阵。

fillCounterClockwise

按照逆时针方向填充矩阵,逻辑与顺时针对称。

边界变量(top / bottom / left / right)

用于控制当前“环”的上下左右范围。

printMatrix

辅助函数,用于输出二维矩阵。

main

演示不同方向的环形矩阵填充效果。


项目详细总结

通过本项目,你可以扎实掌握:

  • 二维矩阵遍历的通用模型

  • 边界控制在算法中的重要性

  • 如何写出不乱、不漏、不重复的矩阵代码

  • 将抽象算法转化为清晰工程实现的能力

这是一个非常经典、回报率极高的 C++ 算法训练项目


项目常见问题及解答

Q1:为什么需要判断top <= bottom
A:防止奇数阶矩阵中间元素被重复填充。

Q2:可以扩展成 M×N 吗?
A:可以,只需分别维护行列边界。

Q3:这是最优解吗?
A:时间复杂度已达到理论最优。


扩展方向与性能优化

  1. 支持 M × N 非方阵

  2. 改为“打印而非填充”

  3. 改造为 ZigZag / 波浪矩阵

  4. 图像像素环形遍历

  5. 与 BFS / DFS 网格算法结合

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

终极词库转换指南:3步实现20+输入法无缝迁移

终极词库转换指南&#xff1a;3步实现20输入法无缝迁移 【免费下载链接】imewlconverter ”深蓝词库转换“ 一款开源免费的输入法词库转换程序 项目地址: https://gitcode.com/gh_mirrors/im/imewlconverter 还在为换输入法就要重新积累词库而烦恼吗&#xff1f;每次更换…

作者头像 李华
网站建设 2026/4/22 8:07:45

【c++】模板进阶

在一些特定的情况&#xff0c;会用到常量&#xff1b;如我们需要一个定长的数组时。控制数组长度的类型时确定的&#xff08;如size_t&#xff09;&#xff0c;这样我们只设置一个类型参数就可以了。代码语言&#xff1a;javascriptAI代码解释namespace xian {//定义一个模板类…

作者头像 李华
网站建设 2026/5/1 8:01:38

SmartDock桌面启动器:5步打造专属Android工作站

SmartDock桌面启动器&#xff1a;5步打造专属Android工作站 【免费下载链接】smartdock A user-friendly desktop mode launcher that offers a modern and customizable user interface 项目地址: https://gitcode.com/gh_mirrors/smar/smartdock SmartDock是一款专为A…

作者头像 李华
网站建设 2026/5/1 7:57:38

StructBERT零样本分类器性能对比:不同文本长度的表现

StructBERT零样本分类器性能对比&#xff1a;不同文本长度的表现 1. 引言&#xff1a;AI 万能分类器的兴起与挑战 在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;文本分类是构建智能系统的核心能力之一。传统方法依赖大量标注数据进行监督训练&#xff0c;成本高…

作者头像 李华
网站建设 2026/5/1 7:57:43

E-Hentai漫画下载终极指南:一键批量收藏完整教程

E-Hentai漫画下载终极指南&#xff1a;一键批量收藏完整教程 【免费下载链接】E-Hentai-Downloader Download E-Hentai archive as zip file 项目地址: https://gitcode.com/gh_mirrors/eh/E-Hentai-Downloader 还在为E-Hentai上心爱的漫画无法批量下载而烦恼吗&#xf…

作者头像 李华