1. 程式人生 > >1050 螺旋矩陣 (25 分)

1050 螺旋矩陣 (25 分)

本題要求將給定的 N 個正整數按非遞增的順序,填入“螺旋矩陣”。所謂“螺旋矩陣”,是指從左上角第 1 個格子開始,按順時針螺旋方向填充。要求矩陣的規模為 m 行 n 列,滿足條件:m×n 等於 N;m≥n;且 m−n 取所有可能值中的最小值。

輸入格式:

輸入在第 1 行中給出一個正整數 N,第 2 行給出 N 個待填充的正整數。所有數字不超過 10​4​​,相鄰數字以空格分隔。

輸出格式:

輸出螺旋矩陣。每行 n 個數字,共 m 行。相鄰數字以 1 個空格分隔,行末不得有多餘空格。

輸入樣例:

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

輸出樣例:

98 95 93
42 37 81
53 20 76
58 60 76
#include <bits/stdc++.h>
using namespace std;

int main()
{
    int N,n,m;
    int a[10001];
    cin>>N;
    for(int i=0; i<N; i++)
    {
        cin>>a[i];
    }
    n=sqrt(N);
    while(N%n)n--;
    m=N/n;
    int s[m][n];
    sort(a,a+
N); int t=N-1,x=0; for(; x*2<n; x++) { for(int i=x; i<n-x; i++) { s[x][i]=a[t--]; } for(int i=x+1; i<m-x; i++) { s[i][n-1-x]=a[t--]; } for(int i=n-x-2; i>=x; i--) { s[m-1-x][i]=
a[t--]; } if(n-1-x>x) { for(int i=m-x-2; i>=x+1; i--) { s[i][x]=a[t--]; } } } for(int i=0; i<m; i++) { for(int j=0; j<n; j++) { if(j!=0)cout<<" "; cout<<s[i][j]; } cout<<endl; } }