首页 > 代码库 > code第一部分数组:第十五题 矩阵翻转(图像翻转)

code第一部分数组:第十五题 矩阵翻转(图像翻转)

code第一部分数组:第十五题 矩阵翻转(图像翻转)

 

首先想到,纯模拟,从外到内一圈一圈的转,但这个方法太慢。
如下图,首先沿着副对角线翻转一次,然后沿着水平中线翻转一次。

技术分享

源代码

#include <iostream>
#include <vector>
using namespace std;


//引用类型形参
void swap(int &n,int &m)
{
    int temp=n;
    n=m;
    m=temp;
}

//指针类型形参
void swap1(int *a, int *b)
{
    int temp;
    temp = *a;
    *a = *b;
    *b = temp;   
}

//采用加减法的swap函数
void swap2(int &a, int &b)
{
    a = a + b;
    b = a - b;
    a = a - b;
}

//使用异或运算的swap函数
void swap3(int &a, int &b)
{
    a = a^b;
    b = a^b;
    a = a^b;
}


void rotate(int a[][3],int n)
{
    //int i,j;
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n-i; j++)
        {
            swap(a[i][j],a[n-j-1][n-i-1]);
        }
    }

    for (int i = 0; i < n/2; i++)
    {
        for (int j = 0; j < n; j++)
        {
            swap(a[i][j],a[n-i-1][j]);
        }
    }

}


void rotate2(vector<vector<int>>& matrix)
{
    const int n = matrix.size();
    for (int i = 0; i < n; i++)
    {// 沿着副对角线反转
        for (int j = 0; j < n - i; j++)
        {
            swap(matrix[i][j], matrix[n - 1 - j][n - 1 - i]);
        }
    }

    for (int i = 0; i < n / 2; i++)
    {// 沿着水平中线反转
        for (int j = 0; j < n; j++)
        {
            swap(matrix[i][j], matrix[n - 1 - i][j]);
        }
    }
}



int main()
{
    int a[3][3]={{1,2,3},{4,5,6},{7,8,9}};
    rotate(a,3);

    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j< 3; j++)
        {
            cout<<a[i][j]<<endl;
        }
    }

    vector<vector<int>> matrix={{1,2,3},{4,5,6},{7,8,9}};
    rotate2(matrix);
    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j< 3; j++)
        {
            cout<<matrix[i][j]<<endl;
        }
    }
    /*vector<int> row1 = {1,2,3};
    vector<int> row2 = {4,5,6};
    vector<int> row3 = {7,8,9};
    vector<vector<int>> matrix;
    matrix.push_back(row1);
    matrix.push_back(row2);
    matrix.push_back(row3);
    rotate2(matrix);
    int n = matrix.size();
    for(int i = 0;i < n;i++){
        for(int j = 0;j < n;j++){
            cout<<matrix[i][j]<<endl;
        }
    }*/
    return 0;
}

 

code第一部分数组:第十五题 矩阵翻转(图像翻转)