当前位置: 首页 > news >正文

二维数组的旋转与翻转(C++)(上(这只是简单讲解))

二维数组的旋转与翻转(C++)

引言

在计算机科学中,二维数组是一种常见的数据结构,广泛应用于图像处理、数据挖掘、机器学习等多个领域。二维数组的旋转与翻转是处理二维数据时经常需要用到的操作。本文将详细介绍二维数组的旋转与翻转的原理及其在C++中的实现方法。

二维数组旋转

旋转原理

二维数组的旋转实质上是对数组元素坐标的变换。对于一个 n×n 的二维数组,我们可以将其视为一个正方形网格。旋转操作可以分为顺时针旋转90度、180度、270度。

顺时针旋转90度

  • 坐标变换: 假设原始数组中的元素位于 (i, j) 位置,旋转后的新位置将是 (j, n-1-i)

  • 步骤:

    1. 首先,将数组沿主对角线(从左上角到右下角的对角线)进行对称变换。

    2. 然后,对变换后的数组每一行进行水平翻转。

void Rotate90(vector<vector<int>>& matrix) {int n = matrix.size();// Step 1: Transpose the matrix along the main diagonal.for (int i = 0; i < n; ++i) {for (int j = i + 1; j < n; ++j) {swap(matrix[i][j], matrix[j][i]);}}// Step 2: Reverse each row.for (int i = 0; i < n; ++i) {reverse(matrix[i].begin(), matrix[i].end());}
}

顺时针旋转180度

  • 坐标变换: 原始位置 (i, j) 旋转后的新位置将是 (n-1-i, n-1-j)

  • 步骤:

    1. 直接对数组进行两次90度旋转即可实现180度旋转。

void Rotate180(vector<vector<int>>& matrix) {Rotate90(matrix);Rotate90(matrix);
}

顺时针旋转270度

  • 坐标变换: 原始位置 (i, j) 旋转后的新位置将是 (n-1-j, i)

  • 步骤:

    1. 直接对数组进行一次90度旋转即可实现270度旋转。

void Rotate270(vector<vector<int>>& matrix) {Rotate90(matrix);
}

二维数组翻转

翻转原理

二维数组的翻转主要包括水平翻转、垂直翻转以及沿对角线翻转。

水平翻转

  • 坐标变换: 原始位置 (i, j) 翻转后的新位置将是 (i, n-1-j)

  • 步骤:

    1. 对数组的每一行进行水平翻转。

void FlipHorizontal(vector<vector<int>>& matrix) {int n = matrix.size();for (int i = 0; i < n; ++i) {reverse(matrix[i].begin(), matrix[i].end());}
}

垂直翻转

  • 坐标变换: 原始位置 (i, j) 翻转后的新位置将是 (n-1-i, j)

  • 步骤:

    1. 对数组的整体进行垂直翻转。

void FlipVertical(vector<vector<int>>& matrix) {int n = matrix.size();for (int i = 0; i < n / 2; ++i) {for (int j = 0; j < n; ++j) {swap(matrix[i][j], matrix[n - 1 - i][j]);}}
}

沿对角线翻转

  • 坐标变换: 原始位置 (i, j) 翻转后的新位置将是 (j, i)

  • 步骤:

    1. 对数组进行转置。

void FlipDiagonal(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]);}}
}

总结

通过对二维数组进行旋转和翻转的操作,我们可以更加灵活地处理图像和其他二维数据。在实际应用中,这些操作往往需要结合具体的业务场景来进行优化,以提高效率和减少资源消耗。希望本文的内容能够帮助大家更好地理解和掌握二维数组的旋转与翻转技术。

http://www.lryc.cn/news/457044.html

相关文章:

  • 【在Linux世界中追寻伟大的One Piece】System V共享内存
  • 【大数据】Spark弹性分布式数据集RDD详细说明
  • 人参玉桂膏简介
  • 消费者Rebalance机制
  • 消息队列介绍
  • 告别@Value,Spring Boot 3.3更优雅的配置注入方案
  • 甲虫身体图像分割系统源码&数据集分享
  • Qt - QMenu
  • 舵机驱动详解(模拟/数字 STM32)
  • dvwa:文件包含、文件上传
  • 基于 C# .NET Framework 4.0 开发实现 WCF 服务实例详解(二)——实现Windows服务内嵌WCF服务
  • 【ArcGIS/C#】调用控制台处理代码
  • 06_23 种设计模式之《适配器模式》
  • Go语言--快速入门
  • 京东云主机怎么用?使用京东云服务器建网站(图文教程)
  • Linux 基础入门操作-实验七 进程的介绍
  • SQL进阶技巧:SQL中的正则表达式应用?
  • 算法数组面试理论
  • ASP.NET Zero是什么?适合哪些业务场景?
  • 获取期货股票分钟级别数据以及均线策略
  • 入门篇-1 数据结构简介
  • Anaconda安装
  • Elasticsearch学习笔记(六)使用集群令牌将新加点加入集群
  • 项目建设方案,软件技术方案,整体技术方案,软件建设文档编制(word原件)
  • vue3定义组件
  • BOM常见操作方法汇总
  • Python+whisper/vosk实现语音识别
  • 如何在算家云搭建LivePortrait(视频生成)
  • CSS 命名规范及 BEM 在前端开发中的实践
  • SwiftUI 6.0(iOS 18)新增的网格渐变色 MeshGradient 解惑