分析:模拟,螺旋数组输出
#include <iostream>
#include<cstring>
#include<vector>
#include<stdio.h>
#include<algorithm>
using namespace std;
int n,k,p;
int cmp(int a,int b)
{
return a > b;
}
int a[100001];
int ans[10001][10001];
int main()
{
cin>>n;
for(int i = 1; i<= n; i++)
cin>>a[i];
sort(a + 1, a + 1 + n, cmp);
int rows,cols,t = 999999999;
for(int i = 1; i <= n; i++)
{
if(n % i == 0 && abs(i - (n / i)) < t)
{
rows = i;cols = n / i; t = abs(i - (n / i));
}
}
if(rows < cols)swap(rows,cols);
int f = 1;
int r = 1, c = 1;
int cnt = 1;
int left = 1,right = cols,up = 1,down = rows;
while(cnt <= n)
{
if(f == 1)
{
for(;c<=right;c++)
ans[r][c] = a[cnt++];
f = 2;
up++;
r++;
c--;
}
else if(f == 2)
{
for(;r<=down;r++)
ans[r][c] = a[cnt++];
f = 3;
right--;
r--;
c--;
}
else if(f == 3)
{
for(;c>=left;c--)
ans[r][c] = a[cnt++];
f = 4;
down--;
r--;
c++;
}
else if(f == 4)
{
for(;r>=up;r--)
ans[r][c] = a[cnt++];
f = 1;
left++;
r++;
c++;
}
}
for(int i = 1; i <= rows; i++)
{
for(int j = 1;j<=cols;j++)
{
if(j == 1)
cout<<ans[i][j];
else
cout<<" "<<ans[i][j];
}
cout<<endl;
}
return 0;
}