算法 C语言 旋转图像(二维数组)在原数组上旋转 以及算法在工作项目中的应用

有关算法

算法对于程序猿呢,就像习武之人的内功;有空闲时间就练一练,总是有好处的

题目

给定一个n*n的二维矩阵matrix表示一个图像。请你将图像顺时针旋转90度。
举例:

在这里插入图片描述
输入: matrix=[[5,1,9,11],[2,4,8,10],[13,3,6,7],[15,14,12,16]]
输出:[[15,13,2,5],[14,3,4,1],[12,6,8,9],[16,7,10,11]]

解题思路

仔细看旋转之前二维矩阵和旋转之后二维矩阵之间的变化,可以得到:

  1. 二维矩阵先上下交换
  2. 再对角线替换

算法实现代码


void rotate(int matrix[][4], int matrixSize) {
    
    

    int temp; 

    //上下交换
    //得到
//    15 14 12 16
 //   13 3  6   7
//    2  4  8   10
 //   5  1  9   11
    for (int i = 0; i < matrixSize/2; i++)
        for (int j = 0; j < matrixSize; j++) {
    
    
            temp = matrix[i][j];
            matrix[i][j] = matrix[matrixSize - i - 1][j];
            matrix[matrixSize - i - 1][j] = temp;
        }


// 对角线交换 即可得到旋转二维矩阵
    for (int i = 0; i < matrixSize - 1; i++) {
    
    
        for (int j = i + 1; j < matrixSize; j++) {
    
    
            temp = matrix[i][j];
            matrix[i][j] = matrix[j][i];
            matrix[j][i] = temp;
        }
    }

}

完整代码


#include <stdio.h>

void rotate(int matrix[][4], int matrixSize) {
    
    

    int temp; 


    for (int i = 0; i < matrixSize/2; i++)
        for (int j = 0; j < matrixSize; j++) {
    
    
            temp = matrix[i][j];
            matrix[i][j] = matrix[matrixSize - i - 1][j];
            matrix[matrixSize - i - 1][j] = temp;
        }



    for (int i = 0; i < matrixSize - 1; i++) {
    
    
        for (int j = i + 1; j < matrixSize; j++) {
    
    
            temp = matrix[i][j];
            matrix[i][j] = matrix[j][i];
            matrix[j][i] = temp;
        }
    }



}

int main()
{
    
    

    int matrix[4][4] = {
    
     {
    
    5,1,9,11},{
    
    2,4,8,10},{
    
    13,3,6,7},{
    
    15,14,12,16} };


    for (int i = 0; i < 4; i++) {
    
    

        for (int j = 0; j < 4; j++) {
    
    
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }

    printf("\n\n\n");

    rotate(matrix,4);

    for (int i = 0; i < 4; i++) {
    
    

        for (int j = 0; j < 4; j++) {
    
    
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }

    printf("\n\n\n");

 



	return 0;
}

写在最后的话

  不要认为算法在工作中用不到哦,都是可以用到的。
  1. 比如这次顺时针旋转图片90度,在一些项目工作中就可以用到。Android Camera回到得到的图像数据就是需要顺时针旋转90度才可以竖着显示。

在这里插入图片描述
旋转90度之后就是获取到竖着的图像:
在这里插入图片描述

  1. 比如通过MediaProjection获取屏幕信息得到的图片是竖着的,把这张图片输入到编码器或者到底层做一些处理,那么就需要逆时针旋转90度之后再做后续处理

猜你喜欢

转载自blog.csdn.net/weixin_43911199/article/details/127182521