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

二维数组的旋转与翻转(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.kler.cn/news/337792.html

相关文章:

  • 脑机接口技术的未来与现状:Neuralink、机械手臂与视觉假体的突破
  • STM32外设应用知识详解
  • 移除元素(算法题分享)
  • 大模型之大模型压缩(量化、剪枝、蒸馏、低秩分解),推理(vllm)
  • 【ubuntu】ubuntu20.04安装chrome浏览器
  • Windows安全加固详解
  • 开发自定义starter
  • 二维数组的旋转与翻转(C++)(下(这是仔细讲解))
  • 在线教育系统开发:SpringBoot框架的实战应用
  • C++版iwanna1
  • Linux下使用apt和pip安装软件包时它们的安装位置
  • Java Web开发简介
  • MySQL多表查询:列子查询
  • Crypto虐狗记---”你“和小鱼(四)
  • 引领未来科技,精准链接IT精英 —— “万码优才“,IT技术人才找工作神器。
  • MySQL从0到1基础语法笔记(上)
  • eNodeB User Manual - Troubleshooting
  • 用 Delphi 做了一个简单的 CMS
  • Django 框架的知识点目录
  • TODO 提交PR修订 小林coding笔记中对TLS握手过程的阐释