PTA刷题Basic篇——1050.螺旋矩阵——Day(25)

题目描述

在这里插入图片描述
以螺旋矩阵的形式输出整个数列

题目分析

我们可以发现,螺旋矩阵是按照从大到小的次序蛇形排列,次序图如下:
在这里插入图片描述
题目没什么技巧,无非就是从大到小排列然后按照规则输出。
个人水平不够,没什么特别的方法,直接暴力总结规律输出了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√

原创文章 101 获赞 13 访问量 2313

猜你喜欢

转载自blog.csdn.net/weixin_44755413/article/details/105894016