在二维数组外面增加一个边界
对于向右的数组,边界就是left_border——right_border
对于向下的数组,边界就是up_border——down_border
对于向左的数组,边界就是right_border——left_border
对于向上的数组,边界就是down_border——up_border
每向右移动,以up_border+1为行,列为left_border+1——right_border-1,遍历完后,将up_border++;
每向下移动,以right_border-1为列,行为up_border+1——down_border-1,遍历完后,将right_border–;
每向左移动,以down_border–为行,列为right_border+1——left_border-1,遍历完后,将down_border–;
每向上移动,以left_border+1为列,行为down_border-1——up_border-1,遍历完后,将left_border++;
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <math.h>
using namespace std;
int Martix[20000][1000];
int a[100000];
bool cmp(int a,int b) {return a>b;}
int main(int argc,char * argv[])
{
int N,m,n,k=0,x=0;
bool down,up,right,left;
cin >> N;
for(int i=0;i<N;i++)
scanf("%d",&a[i]);
sort(a,a+N,cmp);
m=int(sqrt(N*1.0));
while(N%m)
m++;
n=N/m;
if(m<n) swap(m,n);
int right_border=n+1,left_border=0,up_border=0,down_border=m+1;
right=true;
while(x!=N)
{
up_border++;
for(int j=left_border+1;j<right_border&&x!=N;j++)
Martix[up_border][j]=a[x++];
right_border--;
for(int i=up_border+1;i<down_border&&x!=N;i++)
Martix[i][right_border]=a[x++];
down_border--;
for(int j=right_border-1;j>left_border&&x!=N;j--)
Martix[down_border][j]=a[x++];
left_border++;
for(int i=down_border-1;i>up_border&&x!=N;i--)
Martix[i][left_border]=a[x++];
}
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
printf("%d",Martix[i][j]);
if(j!=n) printf(" ");
}
printf("\n");
}
}