PTA C 1050 螺旋矩阵(思路与优化)

news2024/11/19 16:37:29

本题要求将给定的 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

 问题总结:

1.没什么特别的,就是一个找规律的题,和机器人的那一道题有些类似:机器人控制。但是需要解决几个问题。

2.寻找 m * n = N 的两个数,且有 m>n & min(m-n) 比较笨的方法。

void get_m_n(int N, int &m,int &n)
{
    int min = N ;
    for(int i = 1; i <= N; i++)
    {
        for (int j = i; j <= N; j++)
        {
           if(i*j == N)
           {
                if(min > (j-i))
                {
                    min = (j-i);
                    m = j;
                    n = i;
                }
           }
           if(i*j > N)
           {
            break;
           }
        }
    }
}

 3.简单的选择排序

void sort(int *nums,int size)
{
    int t;
    for(int i=0;i<size;i++)
    {
        for(int j = i+1; j<size; j++)
        {
            if(nums[i]<nums[j])
            {
                t = nums[i];
                nums[i] = nums[j];
                nums[j] =t;
            }
        }
    }
}

4.数据范围,m和n的取值决定了程序能不能通过测试点,因此二维数组不能开太大,当然可以用一维数组来优化。开辟 m * n =N的一维数组,将二维矩阵按行顺序存储,通过计算还原元素在二维数组位置的下标,即:一维元素 index = i * n + j;i和j代表二维中的下标,n代表列col数量。

优化前的内存

优化后的内存

 

5.总体实现:未优化

#include <iostream>
#include<cstring>
using namespace std;
void get_m_n(int N, int &m,int &n)
{
    int min = N ;
    for(int i = 1; i <= N; i++)
    {
        for (int j = i; j <= N; j++)
        {
           if(i*j == N)
           {
                if(min > (j-i))
                {
                    min = (j-i);
                    m = j;
                    n = i;
                }
           }
           if(i*j > N)
           {
            break;
           }
        }
    }
}
void sort(int *nums,int size)
{
    int t;
    for(int i=0;i<size;i++)
    {
        for(int j = i+1; j<size; j++)
        {
            if(nums[i]<nums[j])
            {
                t = nums[i];
                nums[i] = nums[j];
                nums[j] =t;
            }
        }
    }
}
int main(int argc, char const *argv[])
{
    bool r = true,d = false,l = false,u=false;
    int N;
    cin>>N;
    int *nums = new int[N];
    memset(nums, 0, sizeof(int)*N);
    for(int i = 0; i <N; i++)
    {
        cin>>nums[i];
    }
    sort(nums,N);
    int m=0,n=0;
    get_m_n(N,m,n);
    int ans[10000][100] = {0};
    int i=0,j=-1;
    int heng = n,shu = m -1;
    for(int index = 0; index < N; )
    {
        if(r)
        {
            for(int step = 0; step < heng; step++)
            {
                ans[i][++j] = nums[index++];
                r = false;
                l = false;
                u = false;
                d = true;

            }
            heng--;
        }
        if(d)
        {
            for(int step=0; step < shu;step++)
            {
                ans[++i][j] = nums[index++];
                d = false;
                u = false;
                r = false;
                l = true;

            }
            shu--;
        }
        if(l)
        {
            for(int step = 0; step < heng; step++)
            {
                ans[i][--j] = nums[index++];
                l = false;
                r = false;
                d = false;
                u = true;

            }
            heng--;
        }
        if(u)
        {
            for(int step=0; step < shu; step++)
            {
                ans[--i][j] = nums[index++];
                u = false;
                l = false;
                d = false;
                r = true;

            }
            shu--;
        }
    }
    for(int row = 0; row < m; row++)
    {
        for (int col = 0; col < n; col++)
        {
            if(col<n-1)
            {
                cout<<ans[row][col]<<" ";
            }
            else
            {
                cout<<ans[row][col];
            }
        }
        cout<<endl;
    }
    return 0;
}

6.优化方案

#include <iostream>
#include<cstring>
using namespace std;
void get_m_n(int N, int &m,int &n)
{
    int min = N ;
    for(int i = 1; i <= N; i++)
    {
        for (int j = i; j <= N; j++)
        {
           if(i*j == N)
           {
                if(min > (j-i))
                {
                    min = (j-i);
                    m = j;
                    n = i;
                }
           }
           if(i*j > N)
           {
            break;
           }
        }
    }
}
void sort(int *nums,int size)
{
    int t;
    for(int i=0;i<size;i++)
    {
        for(int j = i+1; j<size; j++)
        {
            if(nums[i]<nums[j])
            {
                t = nums[i];
                nums[i] = nums[j];
                nums[j] =t;
            }
        }
    }
}
int convert_i_j(int i, int j, int n)
{
    return i*n+j;
}
int main(int argc, char const *argv[])
{
    bool r = true,d = false,l = false,u=false;
    int N;
    cin>>N;
    int *nums = new int[N];
    memset(nums, 0, sizeof(int)*N);
    for(int i = 0; i <N; i++)
    {
        cin>>nums[i];
    }
    sort(nums,N);
    int m=0,n=0;
    get_m_n(N,m,n);
    int *answer= new int[m*n];
    int i=0,j=-1;
    int heng = n,shu = m -1;
    for(int index = 0; index < N; )
    {
        if(r)
        {
            for(int step = 0; step < heng; step++)
            {
                j++;
                int value = nums[index++];
                int index_m_n = convert_i_j(i,j,n);
                answer[index_m_n] = value;
                r = false;
                l = false;
                u = false;
                d = true;
            }
            heng--;
        }
        if(d)
        {
            for(int step=0; step < shu;step++)
            {
                i++;
                int value = nums[index++];
                int index_m_n = convert_i_j(i,j,n);
                answer[index_m_n] = value;
                d = false;
                u = false;
                r = false;
                l = true;
            }
            shu--;
        }
        if(l)
        {
            for(int step = 0; step < heng; step++)
            {
                j--;
                int value = nums[index++];
                int index_m_n = convert_i_j(i,j,n);
                answer[index_m_n] = value;
                l = false;
                r = false;
                d = false;
                u = true;
            }
            heng--;
        }
        if(u)
        {
            for(int step=0; step < shu; step++)
            {
                i--;
                int value = nums[index++];
                int index_m_n = convert_i_j(i,j,n);
                answer[index_m_n] = value;
                u = false;
                l = false;
                d = false;
                r = true;
            }
            shu--;
        }
    }

    for(int row = 0; row < m; row++)
    {
        for (int col = 0; col < n; col++)
        {
            if(col<n-1)
            {
                cout<<answer[row*n+col]<<" ";
            }
            else
            {
                 cout<<answer[row*n+col];
            }
        }
        cout<<endl;
    }
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1573094.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

gitea简单介绍

Gitea是一个轻量级的开源自托管Git服务&#xff0c;提供了类似GitHub的功能和界面。它是一个简单、易于安装和使用的Git代码托管解决方案&#xff0c;适用于个人、小型团队和企业。 Gitea的主要特点如下&#xff1a; 自托管&#xff1a;Gitea允许在自己的服务器上搭建和管理…

zdpreact_antdesginpro 继续优化Ant Design开发的后台管理系统

登录后台管理系统 首先&#xff0c;将项目跑起来&#xff1a; 浏览器访问&#xff1a;http://localhost:8000/user/login 通过上次的优化&#xff0c;我们已经能够使用自己的账号密码进行登录了&#xff1a; 底部优化 登录后台以后&#xff0c;目前的底部是长这样的&…

《QT实用小工具·十六》IP地址输入框控件

1、概述 源码放在文章末尾 该项目为IP地址输入框控件&#xff0c;主要包含如下功能&#xff1a; 可设置IP地址&#xff0c;自动填入框。 可清空IP地址。 支持按下小圆点自动切换。 支持退格键自动切换。 支持IP地址过滤。 可设置背景色、边框颜色、边框圆角角度。 下面…

计算机网络 实验指导 实验12

路由信息协议&#xff08;RIP&#xff09;实验 1.实验拓扑图 名称接口IP地址网关Switch AF0/1192.168.1.1/24F0/2172.1.1.1/24Switch BF0/1192.168.1.2/24F0/2172.2.2.1/24PC1172.1.1.2/24172.1.1.1PC2172.1.1.3/24172.1.1.1PC3172.2.2.2/24172.2.2.1PC4172.2.2.3/24172.2.2.1…

纯小白蓝桥杯备赛笔记--DAY9(动态规划)

文章目录 一、动态规划基础&#xff08;1&#xff09;线性DP简介步骤例题数字三角形--1536破损的楼梯-3367安全序列-3423 &#xff08;2&#xff09;二维DP简介例题摆花--389选数异或--3711数字三角形--505 &#xff08;3&#xff09;最长公共子序列LCSLCS算法模型最长公共子序…

【Kafka】Kafka安装、配置、使用

【Kafka】安装Kafka 1. 安装Kafka2. Kafka使用2.0 集群分发脚本xsync(重要)2.0.1 scp命令2.0.2 rsync远程同步工具2.0.3 写一个集群分发脚本xsync (Shell 脚本) 2.1 Zookeeper安装2.2 对Kafka进行分发2.2.1 执行同步脚本2.2.2 三台云主机配置Kafka环境变量 1. 安装Kafka Kafka…

ARM架构麒麟操作系统安装配置Mariadb数据库

、安装配置JDK (1)检查机器是否已安装JDK 执行 java -version命令查看机器是否安装JDK,一般麒麟操作系统默认安装openjdk 1.8。 (2)安装指定版本JDK 如果麒麟操作系统默认安装的openjdk 1.8不符合需求的话,可以卸载机器安装的openjdk 1.8并按需安装所需的openjdk版本…

Oracle 使用维进行查询重写

Oracle 使用维进行查询重写 conn / as sysdba alter user sh account unlock identified by sh; conn sh/sh query_rewrite_integrity TRUSTED --物化视图的定义 select query from user_mviews where MVIEW_NAMECAL_MONTH_SALES_MV;CREATE MATERIALIZED VIEW cal_month_s…

租用阿里云4核16G服务器优惠价格多少钱?

阿里云4核16G服务器优惠价格26.52元1个月、79.56元3个月、149.00元半年&#xff0c;配置为阿里云服务器ECS经济型e实例ecs.e-c1m4.xlarge&#xff0c;4核16G、按固定带宽 10Mbs、100GB ESSD Entry系统盘&#xff0c;活动链接 aliyunfuwuqi.com/go/aliyun 活动链接打开如下图&a…

京东云服务器4核8G主机租用价格418元一年,1899元3年

京东云轻量云主机4核8G服务器租用价格418元一年&#xff0c;1899元3年&#xff0c;配置为&#xff1a;轻量云主机4C8G-180G SSD系统盘-5M带宽-500G月流量&#xff0c;京东云主机优惠活动 yunfuwuqiba.com/go/jd 可以查看京东云服务器详细配置和精准报价单&#xff0c;活动打开如…

mysql表字段长度扩容分析--MySQL什么情况下拓展字段长度会锁表?

MySQL什么情况下拓展字段长度会锁表&#xff1f; 原生MySQL只支持不跨越256字节的在线扩展&#xff08;online&#xff09;&#xff0c;对于跨越256字节的扩展只支持复制方式&#xff08;copy&#xff09;&#xff0c;扩展时需要锁表且禁止对数据表进行写操作。 字符串的字段是…

MacOS下载和安装HomeBrew的详细教程

在MacOS上安装Homebrew的详细教程如下&#xff1a;&#xff08;参考官网&#xff1a;macOS&#xff08;或 Linux&#xff09;缺失的软件包的管理器 — Homebrew&#xff09; 步骤1&#xff1a;检查系统要求 确保你的MacOS版本至少为macOS Monterey (12) (or higher) 或更高版本…

备战蓝桥杯---数论相关问题

目录 一、最大公约数和最小公倍数 二、素数判断 三、同余 四、唯一分解定理 五、约数个数定理 六、约数和定理 五、快速幂 六、费马小定理 七、逆元 一、最大公约数和最小公倍数 文章链接&#xff1a;最大公约数和最小公倍数 二、素数判断 文章链接&#xff1a;在J…

深入浅出 -- 系统架构之分布式集群的分类

一、单点故障问题 集群&#xff0c;相信诸位对这个概念并不陌生&#xff0c;集群已成为现时代中&#xff0c;保证服务高可用不可或缺的一种手段。 回想起初集中式部署的单体应用&#xff0c;因为只有一个节点&#xff0c;因此当该节点出现任意类型的故障&#xff08;网络、硬件…

《Java面试自救指南》(专题四)Java基础

文章目录 有序集合有哪些?线程安全的集合有哪些&#xff1f;HashMap底层原理ConcurrentHashMap的底层数据结构ArrayList底层原理&#xff0c;ArrayList和Vector/LinkedList的区别String&#xff0c;StringBuffer&#xff0c;StringBuilder的区别 扩展&#xff1a;String不可变…

训练营第十八天(二叉树part05)

第十八天 二叉树part05 513.找树左下角的值 力扣题目链接(opens new window) 题目 给定一个二叉树&#xff0c;在树的最后一行找到最左边的值。 示例 1: 示例 2: 解答 方法一&#xff08;笨方法&#xff0c;使用层次遍历迭代&#xff09; class Solution {public int fi…

【ARM 嵌入式 C 常用数据结构系列 25.1 -- linux 双向链表 list_head 使用详细介绍】

请阅读【嵌入式开发学习必备专栏 】 文章目录 内核双向链表双向链表的数据结构初始化双向链表在双向链表中添加元素遍历双向链表链表使用示例注意事项 内核双向链表 在Linux内核中&#xff0c;双向链表是一种广泛使用的数据结构&#xff0c;允许从任意节点高效地进行前向或后向…

蓝桥杯-冶炼金属(二分求最大最小)

P9240 [蓝桥杯 2023 省 B] 冶炼金属 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 二分做法&#xff1a; #include<bits/stdc.h> using namespace std; #define int long long const int N 1e410; int n,a,b; int v[N],cnt[N]; int check(int x){for(int i1;i<n;i…

写JDBC遇到的问题

执行会出现以下错误信息 java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ? and loginPwd ? at line 1 at com.mysql.cj.jdbc.exceptions…

05-延迟任务精准发布文章

延迟任务精准发布文章 1)文章定时发布 2)延迟任务概述 2.1)什么是延迟任务 定时任务&#xff1a;有固定周期的&#xff0c;有明确的触发时间延迟队列&#xff1a;没有固定的开始时间&#xff0c;它常常是由一个事件触发的&#xff0c;而在这个事件触发之后的一段时间内触发…