Enlace temático: 59. Matriz espiral II
cero, descripción
Dado un entero positivo n, genere una matriz que contenga de 1 a n 2 n^2norte2 todos los elementos, y la matriz de matriz cuadrada nxn con elementos dispuestos en espiral en el sentido de las agujas del reloj
Ejemplo:
Ejemplo 1:
Entrada: n = 3
Salida: [[1,2,3],[8,9,4],[7,6,5]]
Ejemplo 2:
Entrada: n = 1
Salida: [[1]]
1. Solución: Simulación
Generación de matrices de simulación.
La posición inicial se establece en la esquina superior izquierda de la matriz y la dirección inicial se establece a la derecha.
Si la posición del siguiente paso excede el límite de la matriz, o es una posición visitada anteriormente, gire en el sentido de las agujas del reloj e ingrese la siguiente dirección. Repita esto hasta que se llene n 2 n^2norte2 elementos
Clave: lógica en círculos
- Crear una matriz bidimensional
vector<vector<int>> res(n,vector<int>(n));
- En el sentido de las agujas del reloj, primero fije el número de filas, desde (arriba, izquierda) hasta (arriba, derecha)
- Luego fije el número de columnas, desde (superior + 1, derecha) a (inferior, derecha) [Nota: la parte superior necesita +1]
- Luego corrija el número de filas, desde (abajo, derecha-1) hasta (abajo, izquierda)
- A continuación, fije el número de columnas, desde (inferior-1, izquierda) hasta (superior+1, izquierda) [Nota: en este momento, debido al superior+1 arriba, la llegada es superior+1 en este momento]
- completar una vuelta
- Tenga en cuenta que es (superior + 1, izquierda) en este momento, no el punto de inicio del próximo ciclo, sino izquierda + 1
- El punto de partida es (superior+1, izquierda+1)
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> res(n,vector<int>(n));
int up = 0, down = n - 1, left = 0, right = n - 1, index = 1;
while(index <= n * n){
for(int i = left; i <= right; i++){
res[up][i] = index++;
}
up++;
for(int i = up; i <= down; i++){
res[i][right] = index++;
}
right--;
for(int i = right; i >= left; i--){
res[down][i] = index++;
}
down--;
for(int i = down; i >= up; i--){
res[i][left] = index++;
}
left++;
}
return res;
}
};