图像顺时针步进1个像素点的算法

来源:互联网 发布:架子鼓训练软件安卓版 编辑:程序博客网 时间:2024/06/05 07:28

矩阵步进1的算法

这里写图片描述

public void Rotate(int[,] matrix)        {            int n = matrix.GetUpperBound(0) + 1;            int loop = n >> 1;            for (int i = 0; i < loop; i++)            {                int each = n - 2 * i - 1;                for (int j = 0; j < each * 4; j++)                {                    int tmp;                    if (j / each == 0)                    {//top                            tmp = matrix[i, i + j % each + 1];                        matrix[i, i + j % each + 1] = matrix[i, i];                    }                    else if (j / each == 1)                    {//right                         tmp = matrix[i + j % each + 1, n - i - 1];                        matrix[i + j % each + 1, n - i - 1] = matrix[i, i];                    }                    else if (j / each == 2)                    {//bottom                        tmp = matrix[n - i - 1, n - j % each - 2];                        matrix[n - i - 1, n - j % each - 2] = matrix[i, i];                    }                    else                    {//left                        tmp = matrix[n - j % each - 2, i];                        matrix[n - j % each - 2, i] = matrix[i, i];                    }                    matrix[i, i] = tmp;                }            }        }

来看如何将图像顺时针旋转90度!

原题

You are given an n x n 2D matrix representing an image.

Rotate the image by 90 degrees (clockwise).

Follow up:
Could you do this in-place?

代码实现

算法思想:
这里写图片描述

时间复杂度O(n^2),空间复杂度O(1)

   public class Solution    {        //This is in-place algorithm by setting a cache cell        // first dividing layers(n>>1)        // second each layer element moves forward each(n-2*i-1) steps        public void Rotate(int[,] matrix)        {            int n = matrix.GetUpperBound(0) + 1;            int loop = n >> 1;            for (int i = 0; i < loop; i++){                int each = n - 2 * i - 1;                for (int k = 0; k < each; k++) {                    for (int j = k + each; j < each * 4; j += each){                                            int cache;                        if (j / each == 0) {//top                                                       cache = matrix[i, i + j % each];                            matrix[i, i + j % each] = matrix[i, i + k];                        }                        else if (j / each == 1) {//right                                                  cache = matrix[i + j % each, n - i - 1];                            matrix[i + j % each, n - i - 1] = matrix[i, i + k];                        }                        else if (j / each == 2) {//bottom                                                   cache = matrix[n - i - 1, n - j % each - i - 1];                            matrix[n - i - 1, n - j % each - i - 1] = matrix[i, i + k];                        }                        else  {//left                                                 cache = matrix[n - j % each - i - 1, i];                            matrix[n - j % each - i - 1, i] = matrix[i, i + k];                        }                        //matrix[i,i+k]作为缓存区                        matrix[i, i + k] = cache;                    }                }            }        }    }