PAT Nivel B-Matriz en espiral

Descripción del título
Esta pregunta requiere que los N números enteros positivos dados se llenen en la "matriz espiral" en un orden no creciente.

La llamada "matriz en espiral" se refiere al llenado en una dirección en espiral en el sentido de las agujas del reloj a partir de la primera cuadrícula en la esquina superior izquierda.

Se requiere que el tamaño de la matriz sea m filas yn columnas, cumpliendo las condiciones:

  • m × n es igual a N;
  • m ≥ n ;
  • Y m - n toma el valor más pequeño entre todos los valores posibles.

Formato de entrada
Se da un número entero positivo N en la
primera línea y N números enteros positivos que se deben completar en la segunda línea Todos los números no exceden de 10 4 y los números adyacentes están separados por espacios.

Formato de
salida Matriz en espiral de salida. Cada línea contiene n números, un total de m líneas. Los números adyacentes están separados por 1 espacio y no se permite ningún espacio adicional al final de la línea.

Muestra de entrada
12
37 76 20 98 76 42 53 95 60 81 58 93

Salida de muestra
98 95 93
42 37 81
53 20 76
58 60 76


Solución del problema
Matriz de compensación:

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int s[10010];
int N, n, m;

int dx[4] = {
    
    0, 1, 0, -1};
int dy[4] = {
    
    1, 0, -1, 0};

int main()
{
    
    
	cin >> N;
	for (int i = 0; i < N; i ++) cin >> s[i];
	
	sort(s, s + N, greater<int>());
	
	for (int i = 1; i <= N / i; i ++)
	    if(N % i == 0)
	    {
    
    
	        m = i;
	        n = N / i;
	    }
	    
	int x = 0, y = 0, dir = 0;
	vector<vector<int>> g(n, vector<int>(m));
	
	for (int i = 0; i < N; i ++)
	{
    
    
		g[x][y] = s[i];
		int a = x + dx[dir], b = y + dy[dir];
		if(a < 0 || a >= n || b < 0 || b >= m || g[a][b])
		{
    
    
			dir = (dir + 1) % 4;
			a = x + dx[dir], b = y + dy[dir];
		}
		x = a, y = b;
	}
	
	for (int i = 0; i < n; i ++)
	{
    
    
	    cout << g[i][0];
		for (int j = 1; j < m; j ++) cout << ' ' << g[i][j];
		cout << endl;
	}
	
	return 0;
}

Supongo que te gusta

Origin blog.csdn.net/weixin_46239370/article/details/115049283
Recomendado
Clasificación