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

#include <iostream>
#include <stdio.h>


using namespace std;
const int MAXSIZE = 100;
int matrix[MAXSIZE][MAXSIZE];

/*
问题:给定一副由N*N矩阵表示的图像,其中每个像素的大小为4字节,编写一个方法,将
      图像旋转90度。不占用额外控件能否做到?
分析:4字节,这里就是int。关键应该是找到旋转公式。
0 1 2
3 4 5
6 7 8
顺时针旋转后变成
6 3 0
7 4 1
8 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 2
3 4 5
6 7 8
输出:
6 3 0
7 4 1
8 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/2
	for(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/2
	for(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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值