c/c++蓝桥杯经典编程题100道(14)矩阵转置

矩阵转置

->返回c/c++蓝桥杯经典编程题100道-目录


目录

矩阵转置

一、题型解释

二、例题问题描述

三、C语言实现

解法1:使用额外空间(难度★)

解法2:原地转置(仅限方阵,难度★★)

四、C++实现

解法1:使用STL容器(难度★☆)

解法2:原地转置优化(方阵,难度★★)

五、总结对比表

六、特殊方法与内置函数补充

1. C语言中的变长数组(VLA)

2. C++的 swap 函数

3. 并行化优化


一、题型解释

矩阵转置是将矩阵的行和列互换的操作。常见题型:

  1. 基础转置:将任意大小的矩阵行列互换(如 3x2 转为 2x3)。

  2. 原地转置:在不使用额外空间的情况下转置方阵(仅限行数等于列数的矩阵)。

  3. 特殊矩阵转置:对称矩阵的转置(转置后与原矩阵相同)。


二、例题问题描述

例题1:输入 3x3 矩阵:

1 2 3  
4 5 6  
7 8 9  

输出转置结果:

1 4 7  
2 5 8  
3 6 9  

例题2:输入 2x3 矩阵:

1 2 3  
4 5 6  

输出转置结果:

1 4  
2 5  
3 6  

例题3:输入对称矩阵:

1 2 3  
2 4 5  
3 5 6  

输出转置结果与原矩阵相同。


三、C语言实现

解法1:使用额外空间(难度★)

通俗解释

  • 像抄写座位表一样,将原矩阵的行列互换,写入新矩阵。

c

#include <stdio.h>void transpose(int rows, int cols, int src[][cols], int dest[][rows]) {for (int i = 0; i < rows; i++) {for (int j = 0; j < cols; j++) {dest[j][i] = src[i][j]; // 行列互换}}
}int main() {int src[2][3] = {{1, 2, 3}, {4, 5, 6}};int dest[3][2]; // 转置后为3x2transpose(2, 3, src, dest);// 打印结果for (int i = 0; i < 3; i++) {for (int j = 0; j < 2; j++) {printf("%d ", dest[i][j]);}printf("\n");}// 输出:// 1 4// 2 5// 3 6return 0;
}

代码逻辑

  1. 双重循环遍历原矩阵:外层循环行,内层循环列。

  2. 行列互换:将 src[i][j] 赋值给 dest[j][i]

  3. 存储结果:需提前定义目标矩阵 dest,其大小为 cols x rows


解法2:原地转置(仅限方阵,难度★★)

通俗解释

  • 像翻转书页一样,直接在原矩阵上交换元素(仅适用于行数等于列数的方阵)。

c

#include <stdio.h>void transposeInPlace(int n, int matrix[][n]) {for (int i = 0; i < n; i++) {for (int j = i + 1; j < n; j++) { // 只遍历上三角// 交换 matrix[i][j] 和 matrix[j][i]int temp = matrix[i][j];matrix[i][j] = matrix[j][i];matrix[j][i] = temp;}}
}int main() {int matrix[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};transposeInPlace(3, matrix);// 打印结果for (int i = 0; i < 3; i++) {for (int j = 0; j < 3; j++) {printf("%d ", matrix[i][j]);}printf("\n");}// 输出:// 1 4 7// 2 5 8// 3 6 9return 0;
}

代码逻辑

  1. 遍历上三角:避免重复交换(如 i=0,j=1 和 i=1,j=0 是同一个交换操作)。

  2. 元素交换:通过临时变量 temp 交换 matrix[i][j] 和 matrix[j][i]


四、C++实现

解法1:使用STL容器(难度★☆)

通俗解释

  • 用动态数组(vector)实现任意大小的矩阵转置,像搭积木一样灵活操作。

cpp

#include <iostream>
#include <vector>
using namespace std;vector<vector<int>> transpose(vector<vector<int>>& matrix) {int rows = matrix.size();if (rows == 0) return {};int cols = matrix[0].size();vector<vector<int>> result(cols, vector<int>(rows)); // 定义目标矩阵for (int i = 0; i < rows; i++) {for (int j = 0; j < cols; j++) {result[j][i] = matrix[i][j]; // 行列互换}}return result;
}int main() {vector<vector<int>> matrix = {{1, 2, 3}, {4, 5, 6}};auto transposed = transpose(matrix);// 打印结果for (auto& row : transposed) {for (int num : row) {cout << num << " ";}cout << endl;}// 输出:// 1 4// 2 5// 3 6return 0;
}

代码逻辑

  1. 动态矩阵定义:使用 vector<vector<int>> 支持任意大小的矩阵。

  2. 安全访问:检查原矩阵是否为空(rows == 0)。


解法2:原地转置优化(方阵,难度★★)

通俗解释

  • 直接在原矩阵上操作,仅遍历上三角区域,避免重复交换。

cpp

#include <iostream>
#include <vector>
using namespace std;void transposeInPlace(vector<vector<int>>& matrix) {int n = matrix.size();for (int i = 0; i < n; i++) {for (int j = i + 1; j < n; j++) { // 只遍历上三角swap(matrix[i][j], matrix[j][i]); // 使用swap函数}}
}int main() {vector<vector<int>> matrix = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};transposeInPlace(matrix);// 打印结果for (auto& row : matrix) {for (int num : row) {cout << num << " ";}cout << endl;}// 输出:// 1 4 7// 2 5 8// 3 6 9return 0;
}

代码逻辑

  1. 使用 swap 函数:C++标准库函数,直接交换两个元素。

  2. 遍历优化:仅遍历上三角区域(j = i + 1),时间复杂度为 O(n²/2)。


五、总结对比表

方法时间复杂度空间复杂度优点缺点
额外空间转置O(mn)O(mn)支持任意矩阵需要额外空间
原地转置O(n²)O(1)节省空间仅限方阵
STL容器转置O(mn)O(mn)灵活支持动态矩阵依赖STL库

六、特殊方法与内置函数补充

1. C语言中的变长数组(VLA)

  • 作用:允许在函数参数中使用变量定义数组维度(如 int src[][cols])。

  • 限制:C99及以上标准支持,部分编译器可能不兼容。

2. C++的 swap 函数

  • 作用:交换两个变量的值,代码更简洁。

  • 示例swap(a, b) 等效于 int temp = a; a = b; b = temp;

3. 并行化优化

  • 扩展思路:使用多线程或SIMD指令加速大规模矩阵转置(需结合OpenMP或CUDA)。

->返回c/c++蓝桥杯经典编程题100道-目录

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/70624.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

整合 Redis 分布式锁:从数据结构到缓存问题解决方案

引言 在现代分布式系统中&#xff0c;Redis 作为高性能的键值存储系统&#xff0c;广泛应用于缓存、消息队列、实时计数器等多种场景。然而&#xff0c;在高并发和分布式环境下&#xff0c;如何有效地管理和控制资源访问成为一个关键问题。Redis 分布式锁正是为了解决这一问题…

(done) openMP学习 (Day10: Tasks 原语)

url: https://dazuozcy.github.io/posts/introdution-to-openmp-intel/#19-%E6%8A%80%E8%83%BD%E8%AE%AD%E7%BB%83%E9%93%BE%E8%A1%A8%E5%92%8Copenmp 本章节内容仅提供引入&#xff0c;关于 task 更详细的细节请看 openMP 手册或者源材料 Day9 介绍了一个优化链表遍历的粗糙方…

《代码随想录第二十八天》——回溯算法理论基础、组合问题、组合总和III、电话号码的字母组合

《代码随想录第二十八天》——回溯算法理论基础、组合问题、组合总和III、电话号码的字母组合 本篇文章的所有内容仅基于C撰写。 1. 基础知识 1.1 概念 回溯是递归的副产品&#xff0c;它也是遍历树的一种方式&#xff0c;其本质是穷举。它并不高效&#xff0c;但是比暴力循…

网站快速收录策略:提升爬虫抓取效率

本文转自&#xff1a;百万收录网 原文链接&#xff1a;https://www.baiwanshoulu.com/102.html 要实现网站快速收录并提升爬虫抓取效率&#xff0c;可以从以下几个方面入手&#xff1a; 一、优化网站结构与内容 清晰的网站结构 设计简洁明了的网站导航&#xff0c;确保爬虫…

群晖安装Gitea

安装Docker Docker运行Gitea 上传gitea包&#xff0c;下载地址&#xff1a;https://download.csdn.net/download/hmxm6/90360455 打开docker 点击印象&#xff0c;点击新增&#xff0c;从文件添加 点击启动 可根据情况&#xff0c;进行高级设置&#xff0c;没有就下一步 点击应…

ES6 中函数参数的默认值

ES6 引入了函数参数的默认值&#xff08;Default Parameters&#xff09;功能&#xff0c;允许在函数定义时为某些参数提供默认值。当调用函数时&#xff0c;如果这些参数没有传递值&#xff08;或传递的值为 undefined&#xff09;&#xff0c;则会使用默认值。 1. 基本语法 …

SAP ABAP调用DeepSeek API大模型接口

搜索了一下DeepSeek&#xff0c;发现有人已经实现了SAP的对接&#xff0c; 不登录网页&#xff0c;SAP如何使用DeepSeek快速编程&#xff0c;ABAP起飞啦~ 按照对应的注册流程和方法。总算做出了第一个能够直连DeepSeek的API abap程序。 效果不错。 report ZTOOL_ABAP_CALL_D…

如何使用python制作一个天气预报系统

制作一个天气预报系统可以通过调用天气 API 来获取实时天气数据,并使用 Python 处理和展示这些数据。以下是一个完整的指南,包括代码实现和注意事项。 1. 选择天气 API 首先,需要选择一个提供天气数据的 API。常见的天气 API 有: OpenWeatherMap API:提供全球范围内的天…

verilog练习:i2c slave 模块设计

文章目录 前言1. 结构2.代码2.1 iic_slave.v2.2 sync.v2.3 wr_fsm.v2.3.1 状态机状态解释 2.4 ram.v 3. 波形展示4. 建议5. 资料总结 前言 首先就不啰嗦iic协议了&#xff0c;网上有不少资料都是叙述此协议的。 下面将是我本次设计的一些局部设计汇总&#xff0c;如果对读者有…

2025年度Python最新整理的免费股票数据API接口

在2025年这个充满变革与机遇的年份&#xff0c;随着金融市场的蓬勃发展&#xff0c;量化交易逐渐成为了投资者们追求高效、精准交易的重要手段。而在这个领域中&#xff0c;一个实时、准确、稳定的股票API无疑是每位交易者梦寐以求的工具。 现将200多个实测可用且免费的专业股票…

物品匹配问题-25寒假牛客C

登录—专业IT笔试面试备考平台_牛客网 这道题看似是在考察位运算,实则考察的是n个物品,每个物品有ai个,最多能够得到多少个物品的配对.观察题目可以得到,只有100,111,010,001(第一位是ci,第二位是ai,第三位是bi)需要进行操作,其它都是已经满足条件的对,可以假设对其中两个不同…

活动预告 |【Part 1】Microsoft 安全在线技术公开课:通过扩展检测和响应抵御威胁

课程介绍 通过 Microsoft Learn 免费参加 Microsoft 安全在线技术公开课&#xff0c;掌握创造新机遇所需的技能&#xff0c;加快对 Microsoft Cloud 技术的了解。参加我们举办的“通过扩展检测和响应抵御威胁”技术公开课活动&#xff0c;了解如何更好地在 Microsoft 365 Defen…

MySQL 库建表数量有限制吗?

问&#xff1a;MySQL 库建表数量有限制吗&#xff1f; 答&#xff1a;无限制 官方文档&#xff1a; MySQL has no limit on the number of databases. The underlying file system may have a limit on the number of directories. MySQL has no limit on the number of tabl…

【电机控制器】STC8H1K芯片——低功耗

【电机控制器】STC8H1K芯片——低功耗 文章目录 [TOC](文章目录) 前言一、芯片手册说明二、IDLE模式三、PD模式四、PD模式唤醒五、实验验证1.接线2.视频&#xff08;待填&#xff09; 六、参考资料总结 前言 使用工具&#xff1a; 1.STC仿真器烧录器 提示&#xff1a;以下是本…

校园网规划方案

个人博客站—运维鹿: http://www.kervin24.top CSDN博客—做个超努力的小奚&#xff1a; https://blog.csdn.net/qq_52914969?typeblog 本课程设计参考学习计算机网络 思科Cisco Packet Tracer仿真实验_哔哩哔哩_bilibili, 文章和pkg详见个人博客站: http://www.kervin24.to…

【redis】数据类型之list

Redis的List数据类型是一个双向链表&#xff0c;支持在链表的头部&#xff08;left&#xff09;和尾部&#xff08;right&#xff09;进行元素的插入&#xff08;push&#xff09;和弹出&#xff08;pop&#xff09;操作。这使得List既可以用作栈&#xff08;stack&#xff09;…

用 DeepSeek + Kimi 自动做 PPT,效率起飞

以下是使用 DeepSeek Kimi 自动做 PPT 的详细操作步骤&#xff1a; 利用 DeepSeek 生成 PPT 内容&#xff1a; 访问 DeepSeek 官网&#xff0c;完成注册/登录后进入对话界面。输入指令&#xff0c;例如“请用 Markdown 格式生成一份关于[具体主题]的 PPT 大纲&#xff0c;需包…

机器学习怎么学习,还有算法基本的源代码

1.scikit-learn官方文档&#xff0c;中文版/英文版 中文社区&#xff1a;https://scikit-learn.org.cn/ 中文官方文档&#xff1a;https://scikitlearn.com.cn/ 英文版&#xff1a;https://scikit-learn.org/stable/&#xff08;翻墙&#xff09; 2.菜鸟教程&#xff1a;AI&a…

记录安装pdsh中 Linux 系统根目录空间不足导致的编译安装问题

解决 Linux 系统根目录空间不足导致的编译安装问题 问题描述 在 Ubuntu 系统上编译安装 pdsh-2.29 时&#xff0c;由于根目录空间不足&#xff0c;导致 configure 过程中出现以下错误&#xff1a; ./configure: line 1197: cannot create temp file for here-document: No s…

位图的深入解析:从数据结构到图像处理与C++实现

在学习优选算法课程的时候&#xff0c;博主学习位运算了解到位运算的这个概念&#xff0c;之前没有接触过&#xff0c;就查找了相关的资料&#xff0c;丰富一下自身&#xff0c;当作课外知识来了解一下。 位图&#xff08;Bitmap&#xff09;是一种用于表示图像的数据结构&…