Matriz en espiral de la PTA (25 puntos)

Es la mente humana la que libera la luz infinita, y también es la mente humana la que crea la oscuridad ilimitada. La luz y la oscuridad se entrelazan y luchan juntas. Este es el mundo por el que estamos nostálgicos y desamparados.

Esta vez su trabajo es llenar una secuencia de N enteros positivos en una  matriz  en espiral en orden no creciente. Se llena una matriz en espiral desde el primer elemento en la esquina superior izquierda, luego se mueve en una espiral en el sentido de las agujas del reloj. La matriz tiene m filas yn columnas, donde myn satisfacen lo siguiente: m × n debe ser igual a N; m≥n; y m − n es el mínimo de todos los valores posibles.

Especificación de entrada:

Cada archivo de entrada contiene un caso de prueba. Para cada caso, la primera línea da un número entero positivo N. Luego, la siguiente línea contiene N números enteros positivos para ser rellenados en la matriz espiral. Todos los números no son más de 10 4. Los números de una línea están separados por espacios.

Especificación de salida:

Para cada caso de prueba, genere la matriz resultante en m líneas, cada una contiene n números. Debe haber exactamente 1 espacio entre dos números adyacentes y no debe haber espacio adicional al final de cada línea.

Entrada de muestra:

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
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <vector>
#include <ctime>
#include <cctype>
#include <bitset>
#include <utility>
#include <sstream>
#include <complex>
#include <iomanip>
#include<climits>//INT_MAX
//#include<bits/stdc++.h>
#define PP pair<ll,int>
#define inf 0x3f3f3f3f
#define llinf 0x3f3f3f3f3f3f3f3fll
#define dinf 1000000000000.0
#define PI 3.1415926
typedef long long ll;
using namespace std;
int const mod=1e9+7;
const int maxn=1000100;
int N,s[10010],mp[10010][10010];
int mi=inf,m,n;
int main(){
    cin>>N;
    for(int i=1;i<=N;i++)
        cin>>s[i];
    sort(s+1,s+1+N);
    for(int i=1;i<=sqrt(N);i++){
        if(N%i==0){
            int ls=i;
            if(abs(ls-N/ls)<mi){
                n=max(ls,N/ls);
                m=min(ls,N/ls);
            }
        }
    }
//    cout<<m<<' '<<n<<endl;
    int x=0,y=1,d=1;
    for(int i=N;i>=1;i--){
        if(d==1){
            x++;
            if(x>m||mp[y][x]!=0){
                d=2;
                x--;
                y++;
            }
        }
        else if(d==2){
            y++;
            if(y>n||mp[y][x]!=0){
                d=3;
                y--;
                x--;
            }
        }
        else if(d==3){
            x--;
            if(x<1||mp[y][x]!=0){
                d=4;
                x++;
                y--;
            }
        }
        else{
            y--;
            if(y<1||mp[y][x]!=0){
                d=1;
                y++;
                x++;
            }
        }
        mp[y][x]=s[i];
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cout<<mp[i][j];
            if(j!=m)
                cout<<' ';
            else
                cout<<endl;
        }
    }
    return 0;
}

 

Supongo que te gusta

Origin blog.csdn.net/weixin_44170305/article/details/108526634
Recomendado
Clasificación