程序员面试金典: 9.1数组与字符串 6将图像旋转90度

来源:互联网 发布:淘宝怎么换支付宝绑定 编辑:程序博客网 时间:2024/04/30 21:13
#include <iostream>#include <stdio.h>using namespace std;const int MAXSIZE = 100;int matrix[MAXSIZE][MAXSIZE];/*问题:给定一副由N*N矩阵表示的图像,其中每个像素的大小为4字节,编写一个方法,将      图像旋转90度。不占用额外控件能否做到?分析:4字节,这里就是int。关键应该是找到旋转公式。0 1 23 4 56 7 8顺时针旋转后变成6 3 07 4 18 5 2问题转化为如何求N*N矩阵旋转90度的公式,这个忘记了书上解法:将矩阵旋转90度(顺时针),一层一层旋转,每一层执行环状旋转,将上边移到右边,右边移到下边,下边移到左边,左边移到上边注意规律是:规律1:上边横坐标=左边纵坐标左边横坐标=下边纵坐标所以:旋转后的方向[横坐标,] = [,横坐标]规律2:旋转后的方向[,纵坐标] = [n-1-纵坐标,]距离:当n=4,有4行时m[0,0] = m[3,0]m[0,1] = m[2,0]综上规律为:旋转后的方向[x,y] = 原方向[n-1-y,x]输入:3(N)0 1 23 4 56 7 8输出:6 3 07 4 18 5 2关键:1 旋转后方向[x,y] = 原方向[n-1-y,x]2 需要确定大的每一层旋转的次数,layer为0~n/2-1  对于每一层上旋转的元素为: i从layer到n-1-layer,  同时得到对于每一个元素的偏移量为i-first//令上边等于左边旋转,这里的first为行数matrix[first][i] = matrix[last - offset][first];3//确定总共旋转的层数为0~n/2for(int layer = 0 ; layer < n/2 ; layer++){int first = layer;int last = n - 1 - layer;//开始依次遍历需要循环的 0~ n-1个元素(第n-1个元素取不到)for(int i = first ; i < last ; i++){//设置偏移量,该偏移量作用于旋转后方向的纵坐标int offset = i - first;int top = matrix[first][i];//令上边等于左边旋转,这里的first为行数matrix[first][i] = matrix[last - offset][first];*/void matrixRotate(int n){//确定总共旋转的层数为0~n/2for(int layer = 0 ; layer < n/2 ; layer++){int first = layer;int last = n - 1 - layer;//开始依次遍历需要循环的 0~ n-1个元素(第n-1个元素取不到)for(int i = first ; i < last ; i++){//设置偏移量,该偏移量作用于旋转后方向的纵坐标int offset = i - first;int top = matrix[first][i];//令上边等于左边旋转,这里的first为行数matrix[first][i] = matrix[last - offset][first];//令左边等于下边旋转matrix[last-offset][first] = matrix[last][last - offset]; //令下边等于右边旋转matrix[last][last - offset] = matrix[i][last];//令右边等于上边matrix[i][last] = top;}}}void printMatrix(int n){for(int i = 0 ; i < n ; i++){for(int j = 0 ; j < n ; j++){cout << matrix[i][j] << " ";}cout << endl;}}int main(int argc, char* argv[]){int n;while(cin >> n){memset(matrix , 0 , sizeof(matrix));for(int i = 0 ; i < n ; i++){for(int j = 0 ; j < n ; j++){cin >> matrix[i][j];}}matrixRotate(n);printMatrix(n);}system("pause");return 0;}

0 0