注意题目没有说k一定等于m*n,只是提到了行数m一定要大于等于n(如果k是素数,那有k行1列)
#include<bits/stdc++.h>
#include <iostream>
using namespace std;
int a[1000010];
int b[10005][10005];
int main()
{
int k,m,n,i,j;
scanf("%d",&k);
n=(int)sqrt(k);
while(k%n!=0)
n++;
m=k/n;
if(m<n)
{
int t=m;
m=n;
n=t;
}
for(i=1; i<=k; i++)
{
scanf("%d",&a[i]);
}
sort(a+1,a+1+k);
int l,r,x,y;
l=1;
r=m;
x=1;
y=n;
while(1)
{
for(i=x; i<=y; i++)
{
b[l][i]=a[k];
k--;
}
l++;
if(k==0)
break;
for(i=l; i<=r; i++)
{
b[i][y]=a[k];
k--;
}
y--;
if(k==0)
break;
for(i=y; i>=x; i--)
{
b[r][i]=a[k];
k--;
}
r--;
if(k==0)
break;
for(i=r; i>=l; i--)
{
b[i][x]=a[k];
k--;
}
x ++;
if(k==0)
break;
}
for(i=1; i<=m; i++)
{
for(j=1; j<=n; j++)
{
if(j==n)
printf("%d\n",b[i][j]);
else
printf("%d ",b[i][j]);
}
}
return 0;
}
螺旋矩阵
最新推荐文章于 2023-10-24 00:49:32 发布