首页 > 其他分享 >一千题,No.0064(螺旋矩阵)

一千题,No.0064(螺旋矩阵)

时间:2024-06-14 11:00:57浏览次数:16  
标签:一千 point int 矩阵 ++ second No.0064 check first

本题要求将给定的 N 个正整数按非递增的顺序,填入“螺旋矩阵”。所谓“螺旋矩阵”,是指从左上角第 1 个格子开始,按顺时针螺旋方向填充。要求矩阵的规模为 m 行 n 列,满足条件:m×n 等于 N;m≥n;且 m−n 取所有可能值中的最小值。

输入格式:

输入在第 1 行中给出一个正整数 N,第 2 行给出 N 个待填充的正整数。所有数字不超过 104,相邻数字以空格分隔。

输出格式:

输出螺旋矩阵。每行 n 个数字,共 m 行。相邻数字以 1 个空格分隔,行末不得有多余空格。

输入样例:

12
37 76 20 98 76 42 53 95 60 81 58 93

输出样例:

98 95 93
42 37 81
53 20 76
58 60 76

 解题思路:

按照题目硬求解,结果三个样例超时了

#include <bits/stdc++.h>

using namespace std;

int m,n;

void func(int a)
{
    for(int i = sqrt(a)+1;i >= 1;--i)
    {
        for(int j = i;j >= 1;--j)
        {
            if(i * j == a)
            {
                ::m = i;
                ::n = j;
                return;
            }
        }
    }
}

int main()
{
    multiset<int,greater<int>> s;
    int a;
    cin >> a;
    if(a == 1)
    {
        int num;
        cin >> num;
        cout << num;
        return 0;
    }
    else if(a == 0)
    {
        return 0;
    }

    func(a);
    while(a--)
    {
        int num;
        cin >> num;
        s.insert(num);
    }

    int arr[m][n];
    int check[m][n];
    memset(arr,0,sizeof(arr));
    memset(check,0,sizeof(check));
    pair<int,int> point = {0,0};
    auto t = s.begin();
    arr[0][0] = *t;
    check[0][0] = 1;
    ++t;
    while(t != s.end())
    {
        while(point.second+1 < n && t != s.end() && check[point.first][point.second+1] == 0)
        {
            arr[point.first][point.second+1] = *t;
            check[point.first][point.second+1] = 1;
            ++point.second;
            ++t;
        }
        while(point.first+1 < m && t != s.end() && check[point.first+1][point.second] == 0)
        {
            arr[point.first+1][point.second] = *t;
            check[point.first+1][point.second] = 1;
            ++point.first;
            ++t;
        }
        while(point.second-1 >= 0 && t != s.end() && check[point.first][point.second-1] == 0)
        {
            arr[point.first][point.second-1] = *t;
            check[point.first][point.second-1] = 1;
            --point.second;
            ++t;
        }
        while(point.first-1 >= 0 && t != s.end() && check[point.first-1][point.second] == 0)
        {
            arr[point.first-1][point.second] = *t;
            check[point.first-1][point.second] = 1;
            --point.first;
            ++t;
        }
    }

    for(int i = 0;i < m;++i)
    {
        for(int j = 0;j < n;++j)
        {
            if(j != 0) cout << " ";
            cout << arr[i][j];
        }
        cout << endl;
    }
    return 0;
}

后来把set排序改为vector,sort排序依然超时,果断打开柳s的代码,发现不是排序的问题,是m,n的取值函数耗时太大

附上柳s的代码:

for (n = sqrt((double)a); n >= 1; n--)
    {
        if (a % n == 0) {
            m = a / n;
            break;
        }
    }

c++代码如下:

#include <bits/stdc++.h>

using namespace std;

int main()
{
    vector<int> v;
    int a;
    cin >> a;
    int m,n;
    for (n = sqrt((double)a); n >= 1; n--)
    {
        if (a % n == 0) {
            m = a / n;
            break;
        }
    }

    while(a--)
    {
        int num;
        cin >> num;
        v.push_back(num);
    }
    sort(v.begin(),v.end(),greater<int>());

    int arr[m][n];
    int check[m][n];
    memset(arr,0,sizeof(arr));
    memset(check,0,sizeof(check));
    pair<int,int> point = {0,0};
    auto t = v.begin();
    arr[0][0] = *t;
    check[0][0] = 1;
    ++t;
    while(t != v.end())
    {
        while(point.second+1 < n && t != v.end() && check[point.first][point.second+1] == 0)
        {
            arr[point.first][point.second+1] = *t;
            check[point.first][point.second+1] = 1;
            ++point.second;
            ++t;
        }
        while(point.first+1 < m && t != v.end() && check[point.first+1][point.second] == 0)
        {
            arr[point.first+1][point.second] = *t;
            check[point.first+1][point.second] = 1;
            ++point.first;
            ++t;
        }
        while(point.second-1 >= 0 && t != v.end() && check[point.first][point.second-1] == 0)
        {
            arr[point.first][point.second-1] = *t;
            check[point.first][point.second-1] = 1;
            --point.second;
            ++t;
        }
        while(point.first-1 >= 0 && t != v.end() && check[point.first-1][point.second] == 0)
        {
            arr[point.first-1][point.second] = *t;
            check[point.first-1][point.second] = 1;
            --point.first;
            ++t;
        }
    }

    for(int i = 0;i < m;++i)
    {
        for(int j = 0;j < n;++j)
        {
            if(j != 0) cout << " ";
            cout << arr[i][j];
        }
        cout << endl;
    }
    return 0;
}

标签:一千,point,int,矩阵,++,second,No.0064,check,first
From: https://blog.csdn.net/2301_76783671/article/details/139675260

相关文章

  • 一千题,No.0063(数列的片段和)
    给定一个正数数列,我们可以从中截取任意的连续的几个数,称为片段。例如,给定数列{0.1,0.2,0.3,0.4},我们有(0.1)(0.1,0.2)(0.1,0.2,0.3)(0.1,0.2,0.3,0.4)(0.2)(0.2,0.3)(0.2,0.3,0.4)(0.3)(0.3,0.4)(0.4)这10个片段。给定正整数数列,求出全部片段包......
  • 一千题,No.0060(划拳)
    划拳是古老中国酒文化的一个有趣的组成部分。酒桌上两人划拳的方法为:每人口中喊出一个数字,同时用手比划出一个数字。如果谁比划出的数字正好等于两人喊出的数字之和,谁就赢了,输家罚一杯酒。两人同赢或两人同输则继续下一轮,直到唯一的赢家出现。下面给出甲、乙两人的划拳记录,请......
  • 杨氏矩阵和杨辉三角的空间复杂度较小的解题思路
    文章目录题目1杨氏矩阵题目2杨辉三角题目1杨氏矩阵有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的,请编写程序在这样的矩阵中查找某个数字是否存在。要求:时间复杂度小于O(N);思路:我们可以通过题目要求分析得到:矩阵最右上角的数是一行中最大......
  • 宝藏速成宝典(3)螺旋矩阵问题
    一、问题描述1.1、概念   螺旋矩阵是一个用二维数组表示的矩阵,其中的元素按照顺时针或逆时针方向螺旋排列。1.2、问题定义    给定一个二维数组,表示一个螺旋矩阵。其中数组的行数和列数相同,且均为奇数。要求按照顺时针方向(或逆时针方向)依次遍历矩阵中的元......
  • 相机外参和内参矩阵介绍
    相机与变换一、内参与外参概念在计算机视觉中,特别是在相机标定和立体视觉领域,内参(intrinsicparameters)和外参(extrinsicparameters)是非常重要的概念。它们与相机的几何属性和姿态有关。内参(IntrinsicParameters):内参是描述相机内部属性的参数,包括焦距、主点(光学中心)坐标、畸......
  • 36、matlab矩阵特征值、特征向量和奇异值
    1、名词说明1)特征值特征值(Eigenvalues)是矩阵的一个重要概念,在线性代数中起着非常重要的作用。给定一个n×n的方阵A,如果存在一个非零向量v,使得矩阵A作用于向量v后,得到的结果与向量v成比例(即Av=λv,其中λ为标量),那么λ就是矩阵A的特征值,v就是对应于特征值λ的特征向量。特征值......
  • 复数的矩阵表示
    复数复数\(z\)定义:\(a+bi\)其中\(a,b∈R\),\(i^2=-1\),\(i\)又称为圆复数(虚数)单位,\(a\)为实部\(Re(z)=a\),\(b\)为虚部\(Im(z)=b\),复数域记作\(C\)0.复数三角形式和指数形式\(z=a+bi=r(cos\theta+isin\theta)=re^{i\theta}\)1.复数域是实数域的代数(加法和乘法)闭包,定义复......
  • 矩阵乘法与矩阵快速幂
    1矩阵乘法1.定义若矩阵A的大小为\(n\timesm\),矩阵B的大小为\(m\timesp\),则两个矩阵可以做乘法,得到的矩阵C的大小为\(n\timesp\)。\[A=\begin{bmatrix}a_{11}&a_{12}&a_{13}\\a_{21}&a_{22}&a_{23}\end{bmatrix}\]\[B=\begin{bmatrix}b_{11}&b_......
  • 一千题,No.0050(插入与归并)
    根据维基百科的定义:插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列。每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置。如此迭代直到全部元素有序。归并排序进行如下迭代操作:首先将原始序列看成N个只包含1个元素的有序子序列,然后每次迭......
  • 云微客:AI剪辑与视频矩阵的结合,让短视频获客更高效
    近些年来短视频风靡无二,占据了大部分客户群体,用户也逐渐习惯了短视频的存在,搜索问题也逐渐从百度向短视频方向转移,因此短视频平台就成为了吸引大量用户关注和消费的重要渠道。而众多商家也希望通过短视频平台来提升曝光、增加流量,促进实体门店进一步引流获客,谋求发展。因此云......