【C++】B2099 矩阵交换行

文章目录
- 💯前言
- 💯题目描述
- 题目描述
- 输入格式
- 输出格式
- 输入输出样例
- 输入 #1
- 输出 #1
- 💯题目分析
- 💯不同解法分析
- 我的做法
- 实现步骤:
- 优点:
- 不足:
- 老师的做法
- 实现步骤:
- 优点:
- 不足:
- 优化与改进
- 优化点:
- 💯小结

💯前言
- 在学习 C++ 的过程中,二维数组操作是一个重要的知识点,而矩阵的行交换问题则是一个经典案例。本文将围绕一道涉及矩阵行交换的题目展开,从题目描述到代码实现,再到优化与拓展,逐步解析这道题的核心思想与实现方式。通过分析不同实现方法的优缺点,本文旨在帮助读者更加全面地理解二维数组操作的精髓。
C++ 参考手册

💯题目描述
题目编号为 B2099 矩阵交换行,具体内容如下:
B2099 矩阵交换行

题目描述
给定一个 5 × 5 的矩阵(数学上,一个 r × c r × c r×c 的矩阵是一个由 r r r 行 c c c 列元素排列成的矩形数组),将第 n n n 行和第 m m m 行交换,输出交换后的结果。
输入格式
输入共 6 行,前 5 行为矩阵的每一行元素,元素与元素之间以一个空格分开。
第 6 行包含两个整数 m , n m, n m,n,以一个空格分开( 1 ≤ m , n ≤ 5 1 \leq m, n \leq 5 1≤m,n≤5)。
输出格式
输出交换之后的矩阵,矩阵的每一行元素占一行,元素之间以一个空格分开。
输入输出样例
输入 #1
1 2 3 4 5
6 7 8 9 0
9 0 3 0 3
4 5 6 7 8
1 2 3 4 5
1 3
输出 #1
9 0 3 0 3
6 7 8 9 0
1 2 3 4 5
4 5 6 7 8
1 2 3 4 5
💯题目分析
这道题的核心是实现对矩阵的行交换操作,其解题关键点包括:
-
矩阵的存储:
- 使用二维数组存储 5 × 5 的矩阵。
- 每个元素通过两层循环读取并存入数组。
-
行交换逻辑:
- 根据用户输入的行号 m m m 和 n n n,将第 m m m 行和第 n n n 行的元素逐列交换。
- 使用一个临时变量(
tmp)作为中转,逐列交换两个行的元素。
-
矩阵的输出:
- 交换完成后,按题目要求的格式输出矩阵。
-
输入校验(可选):
- 检查用户输入的行号是否在合法范围内(1 – 5)。
- 若输入非法,给出提示信息并终止程序。
💯不同解法分析
我的做法
以下是我的实现代码:
#include <iostream>
using namespace std;int main()
{int arr[5][5];for(int i = 0; i < 5; i++){for(int j = 0; j < 5; j++){cin >> arr[i][j];}}int m, n;cin >> m >> n;for(int j = 0; j < 5; j++){int temp = arr[m - 1][j];arr[m - 1][j] = arr[n - 1][j];arr[n - 1][j] = temp;}for(int i = 0; i < 5; i++){for(int j = 0; j < 5; j++){cout << arr[i][j] << " ";}cout << endl;} return 0;
}

实现步骤:
-
矩阵输入:
- 定义一个大小为
5×5的二维数组arr。 - 使用嵌套
for循环将输入的矩阵数据存入数组中。
- 定义一个大小为
-
行交换:
- 使用
for循环遍历矩阵的每一列,逐列交换第m-1行和第n-1行的元素。 - 使用中间变量
temp进行临时存储,确保数据不被覆盖。
- 使用
-
矩阵输出:
- 再次使用嵌套
for循环按题目要求的格式输出矩阵。
- 再次使用嵌套
优点:
- 代码清晰简洁,符合题目要求。
- 行交换逻辑直观明了,适合初学者理解。
不足:
- 缺少输入校验:未对用户输入的行号 m , n m, n m,n 进行有效性检查。
- 硬编码矩阵大小:矩阵大小固定为
5×5,缺乏通用性。 - 优化空间有限:行交换逻辑虽然简单,但仍可进一步封装为函数,提高代码的可读性与复用性。
老师的做法
以下是老师的实现代码:
#include <iostream>
using namespace std;int arr[5][5];
int r1, r2;int main()
{int i = 0;int j = 0;// 输入for (i = 0; i < 5; i++){for (j = 0; j < 5; j++){cin >> arr[i][j];}}cin >> r1 >> r2;// 交换for (i = 0; i < 5; i++){int tmp = arr[r1 - 1][i];arr[r1 - 1][i] = arr[r2 - 1][i];arr[r2 - 1][i] = tmp;}// 输出for (i = 0; i < 5; i++){for (j = 0; j < 5; j++){cout << arr[i][j] << " ";}cout << endl;}return 0;
}

实现步骤:
与我的做法类似,但存在以下不同之处:
-
将数组
arr和行号变量r1, r2定义为全局变量。- 优点:全局变量的定义使得主函数更简洁。
- 缺点:全局变量的使用可能影响代码的模块化和可维护性。
-
对于矩阵输入和输出,老师使用了固定的循环变量
i和j。 -
行交换逻辑与我的实现方式基本一致,采用中间变量
tmp完成逐列交换。
优点:
- 与我的实现类似,逻辑清晰简洁。
- 更贴近 C++ 的传统写法。
不足:
- 全局变量的使用:全局变量虽然简化了代码,但可能导致后续维护问题,尤其在多函数代码中。
- 缺少输入校验:未验证用户输入的行号是否在合法范围内。
优化与改进
结合上述分析,可以对代码进行以下优化:
- 输入校验:确保用户输入的行号合法。若输入非法,输出错误信息并终止程序。
- 封装行交换逻辑:将行交换封装为函数,提升代码的可读性与复用性。
- 避免硬编码:使用常量定义矩阵大小,提高代码的通用性。
- 避免全局变量:将全局变量改为局部变量,提升代码的模块化。
以下是优化后的代码:
#include <iostream>
using namespace std;const int SIZE = 5; // 定义常量矩阵大小void swapRows(int arr[SIZE][SIZE], int r1, int r2) {for (int i = 0; i < SIZE; i++) {int tmp = arr[r1][i];arr[r1][i] = arr[r2][i];arr[r2][i] = tmp;}
}int main() {int arr[SIZE][SIZE]; // 定义局部变量int r1, r2;// 输入矩阵for (int i = 0; i < SIZE; i++) {for (int j = 0; j < SIZE; j++) {cin >> arr[i][j];}}// 输入行号并校验cin >> r1 >> r2;if (r1 < 1 || r1 > SIZE || r2 < 1 || r2 > SIZE) {cout << "Invalid row numbers" << endl;return 1; // 错误退出}// 如果两行相同,无需交换if (r1 != r2) {swapRows(arr, r1 - 1, r2 - 1);}// 输出矩阵for (int i = 0; i < SIZE; i++) {for (int j = 0; j < SIZE; j++) {if (j > 0) cout << " "; // 控制空格输出cout << arr[i][j];}cout << endl;}return 0;
}

优化点:
- 输入校验逻辑确保程序健壮性。
- 行交换逻辑封装为独立函数,提高代码复用性。
- 使用常量定义矩阵大小,避免硬编码。
- 仅使用局部变量,减少全局变量的使用。
💯小结
通过对这道题的详细分析和代码实现的对比,可以看到,每一种实现方式都有其优点与不足。优化后的代码在逻辑清晰性、代码复用性和程序健壮性上得到了显著提升。
二维数组操作是 C++ 学习中的重要部分,理解其核心逻辑并掌握优化技巧,对于提升编程能力至关重要。希望本文能够帮助读者更好地理解和运用这些知识。

![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
相关文章:
【C++】B2099 矩阵交换行
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯题目描述题目描述输入格式输出格式输入输出样例输入 #1输出 #1 💯题目分析💯不同解法分析我的做法实现步骤:优点:不足&#…...
论文解读 | NeurIPS'24 IRCAN:通过识别和重新加权上下文感知神经元来减轻大语言模型生成中的知识冲突...
点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入! 点击 阅读原文 观看作者讲解回放! 作者简介 史丹,天津大学博士生 内容简介 大语言模型(LLM)经过海量数据训练后编码了丰富的世界知识。最近的研究表明,…...
edeg插件/扩展推荐:助力生活工作
WeTab 此插件在我看来有2个作用 1.改变edeg的主页布局和样式,使其更加精简,无广告 2.提供付费webtab Ai(底层是chatGpt) 沉浸式翻译 此插件可翻译网页的内容 假设我们浏览github 翻译前 翻译后 Better Ruler 可以对网页的距离进行测量 适合写前端的小伙伴 用法示例:...
基于Python读取ZIP和TAR格式压缩包教程
在数据处理和文件管理中,压缩包(如ZIP、TAR等格式)的使用非常普遍。Python提供了多种库来读取和处理这些压缩包。本文将介绍如何使用Python的内置库和第三方库来读取ZIP和TAR格式的压缩包。 1、读取ZIP文件 Python的zipfile模块提供了处理Z…...
懒人不下床型遥控方案--手机对电脑的简单遥控(无收费方案)
兄弟们,天气越发寒冷,不得不说,对像我这种喜欢看直播睡觉的懒狗越发的不友好了,每次昏昏欲睡但还要下床关直播的操作就像泡完温泉直接冲凉水澡,透心凉,心飞扬。 最进也是有时间找找合适的懒人方案解决这个…...
人工智能知识分享第八天-机器学习_泰坦尼克生存预估线性回归和决策树回归对比案例
泰坦尼克生存预估案例 import pandas as pd from sklearn.model_selection import train_test_split from sklearn.tree import DecisionTreeClassifier from sklearn.metrics import classification_report import matplotlib.pyplot as plt from sklearn.tree import plot_t…...
html中下拉选框的基本实现方式及JavaScript动态修改选项内容情况总结
最近项目中使用到了下拉选项以及通过js判断动态改变选项值的相关操作,查询了一些相关内容,在此记录一下,以免后续再碰到布置如何书写。 一、html中下拉选框的基本方式 在 HTML 中,创建下拉选择框(也叫选择菜单&#…...
sql server期末复习
表操作 创建create 删除drop 修改alter 数据操作 查询 select from <tableName> 插入 insert into <tableName> values 修改 update <tableName> set 删除 delete from <tableName> 授权与收回对数据的操作权限 授予 grant <权…...
LabVIEW语言学习过程是什么?
学习LabVIEW语言的过程可以分为几个阶段,每个阶段的重点内容逐步加深,帮助你从入门到精通。以下是一个简洁的学习过程: 1. 基础入门阶段 理解图形化编程:LabVIEW是一种图形化编程语言,与传统的文本编程语言不同&am…...
小程序租赁系统开发的优势与应用前景分析
内容概要 小程序租赁系统是一种新兴的数字化解决方案,旨在为用户提供更加便捷与高效的租赁服务。它通常包括一系列功能,如在线浏览、即时预定、支付功能以及用户反馈机制。这些系统在使用上极为友好,让用户能够轻松选择所需的商品或服务&…...
『SQLite』安装与基本命令语法
SQLite安装 Windows: 访问 SQLite 的安装网页:https://www.sqlite.org/download.html.向下滚动页面到“Precompiled Binaries for Windows”部分。下载适用于你的系统架构(32-bit 或 64-bit)的预编译二进制文件。将下载的 ZIP 文…...
Unity-Mirror网络框架-从入门到精通之Benchmark示例
文章目录 前言什么是Benchmark?Benchmark 简要说明Benchmark示例BenchmarkNetworkManagerMonsterMovementPlayerMovementInterestManagement性能指标 BenchmarkIdle示例BenchmarkPrediction示例BenchmarkStinkySteak示例 前言 在现代游戏开发中,网络功能…...
毕业项目推荐:基于yolov8/yolov5的行人检测识别系统(python+卷积神经网络)
文章目录 概要一、整体资源介绍技术要点功能展示:功能1 支持单张图片识别功能2 支持遍历文件夹识别功能3 支持识别视频文件功能4 支持摄像头识别功能5 支持结果文件导出(xls格式)功能6 支持切换检测到的目标查看 二、数据集三、算法介绍1. YO…...
今日头条ip属地根据什么显示?不准确怎么办
在今日头条这样的社交媒体平台上,用户的IP属地信息对于维护网络环境的健康与秩序至关重要。然而,不少用户发现自己的IP属地显示与实际位置不符,这引发了广泛的关注和讨论。本文将深入探讨今日头条IP属地的显示依据,并提供解决IP属…...
FPGA设计-如何使用后端工具
目录 简介 布线布局 设计前期 布局布线策略 兼谈如何做第一次布局布线 正确看待map之后的资源占用报告 简介 本章节主要说明Xilinx的一些后端工具能为我们做什么在什么情况下我们考虑使用这些工具至于这些工具具体如何使用可以看Xilinx提供的相关文件 可从www.xilinx.com…...
苍穹外卖04——Redis初入门 在店铺打烊or营业状态管理功能中的使用
Redis入门 redis简介 它以键值对的形式存储数据在内存中,并且以极高的性能和灵活性而著称,通常用于缓存、消息代理以及持久化数据。 - 基于内存存储,读写性能高- 适合存储热点数据(热点商品、资讯、新闻)- 企业应用广泛Windows版下载地址:https://github.com/microsoft…...
【MySQL关于数据库和表结构的增删查改】
数据库和表结构的基本语法 数据库命令关于字符集语法 表操作语法创建表查看表结构修改表修改表名增加字段同时修改字段名和字段数据类型仅修改字段数据类型删除字段 删除表 备份和恢复备份恢复 mysql -h 127.0.0.1 -P 3306 -u root -p mysql -u root -h 和 -p 默认 进入MySQL程…...
JVM实战—11.OOM的原因和模拟以及案例
大纲 1.线上系统突然由于OOM内存溢出挂掉 2.什么是内存溢出及哪些区域会发生内存溢出 3.Metaspace如何因类太多而发生内存溢出 4.无限制调用方法如何让线程的栈内存溢出 5.对象太多导致堆内存实在放不下而内存溢出 6.模拟JVM Metaspace内存溢出的场景(动态生成268个类占1…...
LLM - 使用 LLaMA-Factory 部署大模型 HTTP 多模态服务 教程 (4)
欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/144881432 大模型的 HTTP 服务,通过网络接口,提供 AI 模型功能的服务,允许通过发送 HTTP 请求,交互大模型,通常基于云计算架构,无需在本地部署复杂的模型和硬件,…...
Clickhouse集群部署(3分片1副本)
Clickhouse集群部署 3台Linux服务器,搭建Clickhouse集群3分片1副本模式 1、安装Java、Clickhouse、Zookeeper dpkg -i clickhouse-client_23.2.6.34_amd64.deb dpkg -i clickhouse-common-static_23.2.6.34_amd64.deb dpkg -i clickhouse-server_23.2.6.34_amd64…...
MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...
家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
EtherNet/IP转DeviceNet协议网关详解
一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...
HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...
初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...
