CC150:将一个矩阵旋转90度

一张图像表示成n X n的矩阵,写一个函数把图像旋转90度。不开辟额外的存储空间

我们假设要将图像逆时针旋转90度。原图如下所示:

1 2 3 4

5 6 7 8

9 10 11 12

13 14 15 16

逆时针旋转90度后的图应该是:

4 8 12 16

3 7 11 15

2 6 10 14

1 5 9 13

我们要如何原地进行操作以达到上面的效果呢?可以分两步 第一步交换主对角线两侧的对称元素,

第二步交换第i行和第n-1-i行,即得到结果。 看图示:

原图:           第一步操作后:   第二步操作后:

1 2 3 4              1 5 9 13         4 8 12 16

5 6 7 8              2 6 10 14       3 7 11 15

9 10 11 12        3 7 11 15       2 6 10 14

13 14 15 16      4 8 12 16       1 5 9 13

#include <iostream>
using namespace std;

void swap(int &x,int &y) {
	int k = x;
	x = y;
	y = k;
}
void Transpote(int array[][4],int n) {
	for(int i=0;i<n;i++)
		for(int j=i+1;j<n;j++)
			swap(array[i][j],array[j][i]);
	for(int i=0;i<n/2;i++)
		for(int j=0;j<n;j++)
			swap(array[i][j],array[n-i-1][j]);
}
int main() {
	int array[4][4] = {
		{1,2,3,4},
		{5,6,7,8},
		{9,10,11,12},
		{13,14,15,16}
	};
	for(int i=0;i<4;i++){
		for(int j=0;j<4;j++)
			cout<<array[i][j]<< " ";
		cout<< endl;
	}
	cout<< endl;
	Transpote(array,4);
	for(int i=0;i<4;i++){
		for(int j=0;j<4;j++)
			cout<<array[i][j]<< " ";
		cout<< endl;
	}
	return 0;
}
时间: 2024-12-21 11:52:06

CC150:将一个矩阵旋转90度的相关文章

二维数组(矩阵)之将矩阵旋转90度

将矩阵旋转90度: 题目描述: 例如将一个5*5的矩阵顺时针旋转90度:旋转前 1       2        3         4         5 6       7        8         9        10 11    12      13      14       15 16    17      18      19       20 21    22      23      24       25 选转后: 21     16      11       6

O(1)空间复杂度实现n*n矩阵旋转90度

O(1)空间复杂度实现n*n矩阵旋转90度, #include <iostream> using namespace std; #define ARRAY_SIZE 5 void print_two_array (int a[][ARRAY_SIZE]) { cout << endl;    for (int i=0; i<ARRAY_SIZE; i++) { for (int j=0; j<ARRAY_SIZE; j++) {    cout << a[i

矩阵旋转90度(keep it up)

一张图像表示成NxN的矩阵,图像中每个像素是4个字节,写一个函数把图像旋转90度. 你能原地进行操作吗?(即不开辟额外的存储空间) 这个题第一感觉就是一次交换矩阵的元素: 比如 3*3 矩阵 1 2 3 4 5 6 7 8 9 先处理第一行,一次逆时针旋转四个元素,下面是二次做的 3 2 9          3 6 9 4 5 6          2 5 8 1 8 7          1 4 7 第一次         第二次 如果是5*5的矩阵 1   2   3   4   5 6

算法题:矩阵旋转90度

#include <iostream> #include <iomanip> using namespace std; void Grial(int (*a)[5],int n) { //数组顺时针旋转90度. //边界值的考虑让我小小的思考了一下. int temp; int startX = 0; int startY = 0; int j = 0; while (startX < n/2) { startX = j; for (int i = j; i < n -

矩阵旋转90度

初始化矩阵 void initial_square_matrix(int * * * pm, int n) { pm[0] = new int *[n]; for (int i = 0; i < n; i++) { pm[0][i] = new int[n]; for (int j = 0; j < n; j++) pm[0][i][j] = i * n + j + 1; } } 销毁矩阵 void destroy_square_matrix(int * * * pm, int n) { fo

矩阵逆时针旋转90度,空间复杂度O(1)

将一个矩阵逆时针旋转90度,首先可以沿左上角-右下角斜对角线,进行上下交换数据,然后上下数据交换即可. 1 #include <stdio.h> 2 #include <stdlib.h> 3 //矩阵逆时针旋转90度 4 int main() 5 { 6 int a[3][3]={{1,2,3},{4,5,6},{7,8,9}}; 7 int b[3][3]; 8 int i; 9 int j; 10 int temp; 11 printf("原始矩阵\n")

将一个4X4的数组进行逆时针旋转90度后输出,要求原数组数据随机输入

//将一个4X4的数组进行逆时针旋转90度后输出,要求原数组数据随机输入 #include<stdio.h> int main() { int a[4][4],b[4][4],i,j;//a存放原是数组数据,b存放旋转后的数组数据 printf("please input 16 number:"); for(i=0;i<4;i++) for(j=0;j<4;j++) { scanf("%d",&a[i][j]); b[3-j][i]=

opencv图像原地(不开辟新空间)顺时旋转90度

前一阵朋友碰到这么一道题:将图像原地顺时针旋转90度,不开辟新空间.此题看似平易(题目简短),仔细研究发现着实不容易.经过一番探索后,终于找到了正确的算法,但是当使用opencv实现时,有碰到了困难而且费了一番周折才找到问题所在. 首先,解决这个问题,先简化成原地90度旋转一M×N的矩阵A(注意不是N×N方阵).对于2×3的矩阵A = {1,2,3;4,5,6},其目标为矩阵B = {4,1;5,2;6,3}.因为是原地旋转,这里A和B应指向同一大小为6的内存空间. 这里有这样一个重要的导出公式

利用exif.js解决ios或Android手机上传竖拍照片旋转90度问题

html5+canvas进行移动端手机照片上传时,发现ios手机上传竖拍照片会逆时针旋转90度,横拍照片无此问题:Android手机没这个问题. 因此解决这个问题的思路是:获取到照片拍摄的方向角,对非横拍的ios照片进行角度旋转修正. 利用exif.js读取照片的拍摄信息,详见  http://code.ciaoca.com/javascript/exif-js/ 这里主要用到Orientation属性. Orientation属性说明如下: 旋转角度 参数 0° 1 顺时针90° 6 逆时针9