59. Matriz Espiral II

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:
inserte la descripción de la imagen aquí

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)
    inserte la descripción de la imagen aquí
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;
    }
};

Supongo que te gusta

Origin blog.csdn.net/weifengomg/article/details/128240905
Recomendado
Clasificación