news 2026/8/29 7:29:44

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/8/27 5:38:39

Zotero Style插件终极指南:5步打造个性化文献管理系统

Zotero Style插件终极指南&#xff1a;5步打造个性化文献管理系统 【免费下载链接】zotero-style zotero-style - 一个 Zotero 插件&#xff0c;提供了一系列功能来增强 Zotero 的用户体验&#xff0c;如阅读进度可视化和标签管理&#xff0c;适合研究人员和学者。 项目地址:…

作者头像 李华
网站建设 2026/8/28 9:53:09

PCL2-CE社区版启动器:新手也能轻松掌握的Minecraft游戏配置全攻略

PCL2-CE社区版启动器&#xff1a;新手也能轻松掌握的Minecraft游戏配置全攻略 【免费下载链接】PCL2-CE PCL2 社区版&#xff0c;可体验上游暂未合并的功能 项目地址: https://gitcode.com/gh_mirrors/pc/PCL2-CE 还在为Minecraft启动器复杂难用而烦恼吗&#xff1f;PCL…

作者头像 李华
网站建设 2026/8/21 17:07:11

yfinance实战宝典:从零开始构建专业级金融数据分析平台

yfinance实战宝典&#xff1a;从零开始构建专业级金融数据分析平台 【免费下载链接】yfinance Download market data from Yahoo! Finances API 项目地址: https://gitcode.com/GitHub_Trending/yf/yfinance yfinance作为Python生态中备受推崇的金融数据获取工具&#x…

作者头像 李华
网站建设 2026/8/21 17:07:11

3分钟快速上手:AI图片标注工具的完整使用指南与实战技巧

3分钟快速上手&#xff1a;AI图片标注工具的完整使用指南与实战技巧 【免费下载链接】BooruDatasetTagManager 项目地址: https://gitcode.com/gh_mirrors/bo/BooruDatasetTagManager 还在为数千张图片的手工标注而烦恼吗&#xff1f;BooruDatasetTagManager作为一款专…

作者头像 李华
网站建设 2026/8/29 5:14:57

NS-USBLoader终极指南:告别Switch文件传输困扰的完整解决方案

NS-USBLoader终极指南&#xff1a;告别Switch文件传输困扰的完整解决方案 【免费下载链接】ns-usbloader Awoo Installer and GoldLeaf uploader of the NSPs (and other files), RCM payload injector, application for split/merge files. 项目地址: https://gitcode.com/g…

作者头像 李华
网站建设 2026/8/21 22:35:34

5分钟学会用mermaid绘制专业实体关系图

5分钟学会用mermaid绘制专业实体关系图 【免费下载链接】mermaid 项目地址: https://gitcode.com/gh_mirrors/mer/mermaid mermaid ER图功能让数据建模变得简单直观&#xff0c;只需掌握几个基础语法规则&#xff0c;就能快速创建专业的实体关系图。无论是数据库设计还…

作者头像 李华