Fortuna base izquierda ley tema class3- 6 matriz de rotación cuadrada

Fortuna base izquierda ley tema class3- 6 matriz de rotación cuadrada

1. Tema

[Título] Dada una matriz cuadrada matriz de número entero, la matriz se ajusta para hacer que la
rotación en sentido horario de 90 grados como.
[] Requerido complejidad espacio adicional es O (1), sin utilizar una matriz auxiliar.

Aquí Insertar imagen Descripción

2. Análisis

Análisis: título dado matriz cuadrada, considerar la estructura de la parte posterior de la matriz a la forma como para ser girado por capa de fuera a dentro, después de la primera capa exterior. Pensamos que el mismo sujeto 5 con las esquinas izquierda y derecha de un punto predeterminado (a, b) (c, d). Porque no se puede utilizar una matriz auxiliar, el número de rotación de la tapa antes de que necesita una variable temporal puesta en escena de un número.
(1) Después de un número temporal por a, b, c, d de las cuatro variables 1,4,16,13 cuatro sobrescribe el recuento anterior por uno en el orden de flechas negras;
(2) un par de filas 2,8,15,9 dirección y para secuencialmente (1) una etapa similar a la de revestimiento por rotación, 3,12,14,5, también, de modo que se completa el número de rotación de la capa más externa 12;
a ++, B ++, el C- (3). , lo mismo para la capa interior 6,7,11,10 d-.
Tips : cada número de la fila más exterior 4, hay tres empezando 1,2,3, 2 por dos líneas es sólo un punto de partida para la capa interior 6, a continuación, el número representa la necesidad de punto de partida db es decir, la cantidad de cada ciclo veces. El exterior del título 12 puede girar tres veces el número de ciclos, el número de ciclos de una vez los cuatro interior.

Aquí Insertar imagen Descripción

código 3. núcleo

(1) inicializa a, b, c, d.

int a = 0,b = 0,c = height - 1,d = width - 1;

(2) que gira cada código, por la posición i y a, b, c, d de la matriz de control, el simple capacidad de inspeccionar el código

void rotate_matrix(int arr[][width],int a,int b,int c,int d)
{
	int times = d - b;
		for(int i = 0;i < times;i++)
		{
			int temp = arr[a][b + i];
			arr[a][b + i] = arr[c - i][b];
			arr[c - i][b] = arr[c][d - i];
			arr[c][d - i] = arr[a + i][d];
			arr[a + i][d] = temp;
		}
}

(3) número total de capas requerido para controlar la rotación por a, c dos variables. Izquierda y esquinas derecha de cada punto de una rejilla después de la rotación se mueve gradualmente hacia el centro, porque el sujeto se le da un cuadrado, entonces los dos puntos coinciden sólo es posible mal oscilante abscisa dos puntos A, C controlar la capa de rotación número.

while(a < c)
	{
		rotate_matrix(arr,a++,b++,c--,d--);
	}

4. El código completo

#include<iostream>
#define height 4
#define width 4
using namespace std;

void rotate_matrix(int arr[][width],int a,int b,int c,int d)
{
	int times = d - b;
		for(int i = 0;i < times;i++)
		{
			int temp = arr[a][b + i];
			arr[a][b + i] = arr[c - i][b];
			arr[c - i][b] = arr[c][d - i];
			arr[c][d - i] = arr[a + i][d];
			arr[a + i][d] = temp;
		}
}

void print(int arr[][width])
{
	//打印输出
	for(int i = 0;i < height;i++)
	{
		for(int j = 0;j < width;j++)
		{
			cout<<arr[i][j]<<" " ;
		}
		cout<<endl;
	}
}
int main()
{
	//int arr[height][width] = {1,2,3,4,5,6,7,8,9};
	int arr[height][width] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
	int a = 0,b = 0,c = height - 1,d = width - 1;
	
	while(a < c)
	{
		rotate_matrix(arr,a++,b++,c--,d--);
	}
	print(arr);

 	system("pause");
	return 0;
}

5. La salida

Aquí Insertar imagen Descripción

Publicado 51 artículos originales · ganado elogios 1 · vistas 1387

Supongo que te gusta

Origin blog.csdn.net/shi_xiao_xuan/article/details/103660593
Recomendado
Clasificación