考察点:试除法求约数、方向数组。
类似题:756. 蛇形矩阵。
const int N=10010;
int a[N];
int dx[]={0,1,0,-1},dy[]={1,0,-1,0};
int k,n,m;
int cnt;
bool check(int x,int y)
{
return x>=0 && x<n && y>=0 && y<m;
}
void dfs(int x,int y,int dir,vector<vector<int>> &res)
{
res[x][y]=a[cnt++];
int a=x+dx[dir],b=y+dy[dir];
if(!check(a,b) || res[a][b])
{
dir=(dir+1)%4;
a=x+dx[dir],b=y+dy[dir];
}
if(check(a,b) && !res[a][b])
dfs(a,b,dir,res);
}
int main()
{
cin>>k;
for(int i=0;i<k;i++) cin>>a[i];
sort(a,a+k,greater<int>());
for(int i=1;i*i<=k;i++)
if(k % i == 0)
{
m=i;
n=k/i;
}
vector<vector<int>> res(n,vector<int>(m));
dfs(0,0,0,res);
for(int i=0;i<res.size();i++)
{
for(int j=0;j<res[i].size();j++)
if(j) cout<<' '<<res[i][j];
else cout<<res[i][j];
cout<<endl;
}
//system("pause");
return 0;
}