题目描述
以螺旋矩阵的形式输出整个数列
题目分析
我们可以发现,螺旋矩阵是按照从大到小的次序蛇形排列,次序图如下:
题目没什么技巧,无非就是从大到小排列然后按照规则输出。
个人水平不够,没什么特别的方法,直接暴力总结规律输出了hhhhh。
我们可以发现,每输出一圈,我们再从行或列出发都会少输出一个元素,这其实就是我们的输出边界。由于比较抽象不好描述,大家可以看我的代码然后自己推一下。
代码
#include <cstdio>
#include <iostream>
#include <cstring>
#include <string>
#include <cmath>
#include <algorithm>
#include <vector>
using namespace std;
int main()
{
int n,x,y;
cin>>n;
vector<int> vec(n);
for(int i=0;i<n;i++) cin>>vec[i];
sort(vec.begin(),vec.end(),greater<int>());
for(int i=(int)(sqrt(n)+0.5);i>=1;i--){
if(n%i==0){
x=i;
y=n/i;
break;
}
}
int i=-1,j=-1,k=-1,arr[y][x];
for(i=0;k<y*x-1;i++)
{
//i可以理解为输出圈数,每输出一圈每一行和每一列就要少遍历一个元素
for(j=i;j<x-i&&k<y*x-1;j++) arr[i][j]=vec[++k];
for(j=i+1;j<y-i&&k<y*x-1;j++) arr[j][x-i-1]=vec[++k];
for(j=x-i-2;j>=i&&k<y*x-1;j--) arr[y-i-1][j]=vec[++k];
for(j=y-i-2;j>=i+1&&k<y*x-1;j--) arr[j][i]=vec[++k];
}
for(i=0;i<y;i++)
{
for(j=0;j<x;j++)
{
if(j==0) cout<<arr[i][j];
else cout<<" "<<arr[i][j];
}
cout<<endl;
}
return 0;
}
答题用时18min
Q50——finish√