【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…...
Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...
CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...
基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...
MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
群晖NAS如何在虚拟机创建飞牛NAS
套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...
