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; }