设置两个用于旋转的数组:int dx[4]={0,1,0,-1},dy[4]={1,0,-1,0};
当满足下列情况时开始旋转即可: if(a<0 || a>=m || b<0 || b>=n || ans[a][b])
C++ 代码
#include<bits/stdc++.h>
using namespace std;
const int N = 10010;
int num[N];
int ans[N][N];
int dx[4]={0,1,0,-1},dy[4]={1,0,-1,0};
bool cmp(int a,int b)
{
return a>b;
}
int main()
{
int n,m,k; cin>>k;
for(int i=0;i<k;i++) cin>>num[i];
sort(num,num+k,cmp);
//寻找行m
for(int i=1;i<=k/i;i++)
{
if(k%i==0) m=k/i;
}
//求出列n
n=k/m;
for(int i=0,x=0,y=0,d=0;i<k;i++)
{
ans[x][y]=num[i];
int a=x+dx[d],b=y+dy[d];
//判断是否旋转
if(a<0 || a>=m || b<0 || b>=n || ans[a][b])
{
d=(d+1)%4;
a=x+dx[d],b=y+dy[d];
}
x=a,y=b;
}
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
cout<<ans[i][j]<<" ";
cout<<endl;
}
return 0;
}