1050 螺旋矩阵

2023-11-14

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

输入格式:

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

输出格式:

输出螺旋矩阵。每行 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

思路及注意点:来自《算法笔记》

在这里插入图片描述

AC代码:

//#include<iostream>
//#include<cstring>
#include<algorithm>
#include<cstdio>
#include<cmath>
//#include<map>
//#include<cctype>
using namespace std;

const int maxn=10010;
//二维数组用于打印,一维数组用于输入 
int matrix[maxn][maxn],a[maxn];

bool cmp(int a,int b){
	return a>b;
}

int main()
{
	//输入 
	int N;
	scanf("%d",&N);
	for(int i=0;i<N;i++){
		scanf("%d",&a[i]);
	}
	//排序
	sort(a,a+N,cmp); 
	//特殊情况:N=1
	if(N==1){
		printf("%d",a[0]);
		return 0;
	} 
    //确定m、n、四个边界 
	int m=(int)ceil(sqrt(1.0*N));//若不是整数则向上取整,因为m>=n 
	while(N%m!=0){  //若还不是约数 
		m++;  //找最小的能整除N的m,因为m-n要最小 
	} 
    //i、j是当前欲填的位置(一一对应,方便找规律),now是当前欲填的数的下标 
	int n=N/m,i=1,j=1,now=0; 
	int U=1,D=m,L=1,R=n;
	//螺旋填入二维数组Matrix
	while(now<N){
		//向右 
		while(now<N&&j<R){
			matrix[i][j]=a[now++]; 
			j++;
		}
		//向下
		while(now<N&&i<D){
			matrix[i][j]=a[now++];
			i++;
		} 
		//向左
		while(now<N&&j>L){
			matrix[i][j]=a[now++];
			j--;
		} 
		//向上 
		while(now<N&&i>U){
			matrix[i][j]=a[now++];
			i--;
		} 
		U++;D--;L++;R--;  //缩小边界 
		i++;j++;  //位置移至内层左上角 
		if(now==N-1){  //最后一个元素单独填入
			matrix[i][j]=a[now++];
		} 
	} 
	//输出matrix数组
	for(int i=1;i<=m;i++){
		for(int j=1;j<=n;j++){
			printf("%d",matrix[i][j]);
			if(j<n) printf(" ");
			else printf("\n");
		}
	} 
//	system("pause");
	return 0;
}

总结:

  1. 想要打印成矩阵的形式肯定要用二维数组,其中的值就用输入数组螺旋地填入,其中向左和向上原来可以倒着填,和倒着打印一维数组是一样的
  2. 要学会将题目中的信息转化成精简的、有用的信息。原本m和n我还想暴力两层遍历,现在知道了若知道约数之间的关系,不妨先开根号,慢慢往上取较大者
  3. 打印图形下标最好就从1开始,这样一一对应,也方便找规律
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

1050 螺旋矩阵 的相关文章

随机推荐

  • c语言string函数的用法_C语言奇淫技巧,字符串的三种表示方法,不会用不是合格的程序员...

    1 在C语言中 是将字符串作为字符数组来处理的 字符串是逐个存放到数组元素中的 例如用一个一维的字符数组存放字符串 I am a boy 如下代码 char c 12 I a m a b o y 这个字符串的实际长度是11 数组长度是12
  • 【红队技术】第二节:信息收集

    https note youdao com s M5U3LWvw
  • 如何高效率提出问题?

    前言 我们总是对自己 不太熟悉 的东西 但是又迫切想知道其答案 所以总是 匆匆 的像他人提出问题 然而 我们发现一个现象 为什么大多数时候 我的问题总是很少引起别人的兴趣 言外之意是 我总是不能在 短时间 的得到一个 正确的答案 本篇根据笔
  • Oracle检查点队列–实例崩溃恢复原理剖析

    检查点队列 实例崩溃恢复原理剖析 什么叫检查点队列 检查点队列是将脏块连接起来 按照第一次脏的数据块依次往后串联起来 形成一个队列 检查点的作用是什么 检查点只是一个数据库事件 它存在的根本意义在于减少崩溃恢复时间 Oracle8i以前是没
  • PHPStorm.WebStrom等系列官方开发工具配置本地项目与运程服务器同步

    PHPStorm WebStrom配置本地项目与运程服务器同步 说明 PHPStorm WebStrom等官方的系统开发工具配置本地项目与运程服务器同步的方法都基本一致没有 几乎没有什么不同之处 我们拿WebStorm为例说一下具体的配置过
  • 背光补偿

    背光补偿能提供在非常强的背景光线前面目标的理想的曝光 无论主要的目标移到中间 上下左右或者荧幕的任一位置 背光补偿也称作逆光补偿或逆光补正 它可以有效补偿摄像机在逆光环境下拍摄时画面主体黑暗的缺陷 当摄像机处于逆光环境中拍摄时 画面会出现黑
  • windows,IDEA各种常用快捷键积累

    windows IDEA各种常用快捷键积累 windows快捷键 1 win shfit s 拖动截屏 2 ctrl alt s 系统录屏 IDEA 1 快速形成main方法 psvm 回车 2 快速形成输出语句 sout 回车 3 内容提
  • [转载]推荐:互联网思维必读十本书

    原文地址 推荐 互联网思维必读十本书 作者 梧桐雨 推荐 互联网思维必读十本书 最近在商界最流行的词汇 莫过于 互联网思维 了 互联网思维 就像一部让人垂涎的武林秘籍 得之可化腐朽为神奇 无论是小米 阿芙精油 或是卖煎饼的黄太吉 都宣称自己
  • 神经网络bn公式_BN、LN、IN、GN、SN归一化

    作者 泛音 公众号 知识交点 该小伙子文章写得不错 感兴趣的大家可以关注下 公众号 知识交点 内容包含 BatchNormalization LayerNormalization InstanceNorm GroupNorm Switcha
  • 解决Docker中运行的MySQL8.0中文乱码

    解决Docker中MySQL8 0乱码问题 环境 Ubuntu版本 21 10 64位 Docker版本 20 10 MySQL版本 8 0 27 正文 MySQL命令行无法展示中文 如下图 进入MySQL容器 docker exec it
  • doris同步作业配置参数修改和注意事项

    创建同步作业 创建数据同步作业的的详细语法可以连接到 Doris 后 执行 HELP CREATE SYNC JOB 查看语法帮助 这里主要详细介绍 创建作业时的注意事项 job name job name是数据同步作业在当前数据库内的唯一
  • 5-FreeSwitch-freeswitch开启录音和使用

    文章目录 一 开启 usr local freeswitch conf dialplan 后面的default添加配置 二 在freeswitch重新加载 F6 或者 reloadxml 三 使用录音 3 1单腿录音 方法一 API 方法二
  • Android Studio 运行 遇到 Failed to read key from keystore

    分享一下我老师大神的人工智能教程 零基础 通俗易懂 风趣幽默 还带黄段子 希望你也加入到我们人工智能的队伍中来 https blog csdn net jiangjunshow Error Execution failed for task
  • 成交量加权动量交易系统

    策略说明 基于动量系统 通过交易量加权进行判断 系统要素 用VWM上穿零轴判断多头趋势 入场条件 价格高于VWM上穿零轴时价格通道 且在SetupLen的BAR数目内 做多 出场条件 空头势多单出场 import DataAPI impor
  • 左式堆的合并

    二叉堆对于合并操作是困难的 因为需要把一个数组拷贝到另一个数组 左式堆可以高效的地支持合并操作 左式堆与二叉树之间唯一区别是 左式堆不是平衡的 可能非常趋向不平衡 左式堆的结构 typedef struct TreeNode element
  • DirectX12 3D游戏开发实践(龙书)第四章 Direct3D的初始化

    目录 Direct3D的初始化 预备知识 Direct3D概述 组件对象模型 纹理格式 Textures Formats 交换链和页面翻转 深度缓冲 资源与描述符 多重采样技术的原理 利用Direct3D进行多重采样 功能级别 Direct
  • 客观面试题--32.说下springmvc的五个常用注解?

    1 Controller 在SpringMVC 中 控制器Controller 负责处理由DispatcherServlet 分发的请求 它把用户请求的数据经过业务处理层处理之后封装成一个Model 然后再把该Model 返回给对应的Vie
  • Jenkins集成及在服务器上发布异常 解决方案汇总

    一 在jenkins上构建时出现问题 如下图所示 解决方案 1 单击红色圆球 找到控制台输出 根据错误提示 检查上传到SVN的代码是否完整无错 检出SVN所提交的代码在本地运行 看是否能够成功 二 未能找到类型或命名空间名称 是否缺少 us
  • lvgl-文本框学习篇(五)

    lvgl 文本框学习篇 五 学习材料 工具 QT Creator 5 12 3 lvgl 源代码 lvgl 官方标签例程 极客笔记 学习内容 过程 零件和样式 用法 添加文字 占位符 删除字符 移动光标 隐藏光标 光标闪烁时间 单行模式 密
  • 1050 螺旋矩阵

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