https://pintia.cn/problem-sets/994805260223102976/problems/994805275146436608
测试点1 3 7见
https://blog.csdn.net/qq_39117553/article/details/105164875
思路
直接输出可不好输出,就先申请空的二维数组往里面填数吧,顺时针一圈圈的填
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
bool cmp(int a,int b) {
return a>=b;
}
int main()
{
int n;
cin>>n;
int a[n];
for (int i=0; i<n; ++i)
scanf("%d",&a[i]);
sort(a,a+n,cmp);
int col=sqrt(n);
while (n%col!=0)
--col;
int row=n/col; //row行 col列
int level=row/2+row%2; //圈儿数
int i,j,b[row][col]={0},cnt=0;
for (i=0; i<level; ++i) { //设置多个cnt<n防止重复填
for (j=i; j<col-i && cnt<n; ++j)
b[i][j]=a[cnt++];
for (j=i+1; j<row-i && cnt<n; ++j)
b[j][col-i-1]=a[cnt++];
for (j=col-i-2; j>=i && cnt<n; --j)
b[row-i-1][j]=a[cnt++];
for (j=row-i-2; j>=i+1 && cnt<n; --j)
b[j][i]=a[cnt++];
}
for (i=0; i<row; ++i)
for (j=0; j<col; ++j)
printf("%d%c",b[i][j],j==col-1?'\n':' ');
}