C:9-9题目:蛇形矩阵

news2024/9/22 13:22:28

一、题目介绍:

给你两个整数n,m,请你构造一个n行m列的蛇形方阵,在这个方阵中,数字由1到n×m,从最右上角开始,呈环状(逆时针)向内填充。

比如一个3*3的蛇形方阵

3 2 1
4 9 8
5 6 7

二、解题思路:


分析题目:

1.该矩阵是一个方阵,填入矩阵内的值是从1开始的;

2.该矩阵的填充顺序是逆时针向内填充的。具体可以参考上面所给的蛇形矩阵。

具体思路:
1. 初始化矩阵
 创建一个  n  行  m  列的全零矩阵,用于存储最终的蛇形方阵。
2. 设置起始位置和初始方向
 将起始位置设置为第一行最后一列,即  row = 0 , col = m - 1 。
 初始方向设为向左(可以用数字表示方向,比如 0 表示向左,1 表示向下,2 表示向右,3 表示向上)。
3. 填充数字
 从数字 1 开始,依次填充到矩阵中。
 根据当前方向尝试填充下一个数字。例如,如果当前方向是向左,就尝试在当前列减一的位置填充下一个数字。
 如果下一个位置已经被填充或者超出了矩阵边界,则改变方向。
4. 改变方向
 按照逆时针方向改变方向。如果当前方向是向左,当无法继续向左填充时,改为向下填充,即方向变为 1。如果是向下,当无法继续向下填充时,改为向右填充,以此类推。
5. 重复填充和改变方向的步骤
 不断重复填充数字和改变方向的步骤,直到所有  n×m  个数字都被填充到矩阵中。

三、逐步代码实现:

	int n = 0;
	int m = 0;
	scanf("%d %d", &n, &m);
	int squmat[m][m];
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < m; j++)
		{
			squmat[i][j] = 0;
		}
	}

先初始化n,m,然后键盘输入矩阵行和列,再通过两个for循环将矩阵元素全部填充为0。

变量初始化:

int num = 1;
int row = 0; int col = m - 1;
int change = 0;

这里初始化一些变量,num为输入矩阵的第一个值1, int row = 0; int col = m - 1;使得输入的数字填充在矩阵右上角。

变量change帮助我们实现方向的变化,这里规定一下;

change = 0,1,2,3;填充方向分别是向左,向下,向右,向上。

while循环: 

while (num <= n * m)
{
   squmat[row][col] = num;
   num++;
}

这里我们通过while循环来将数字填充到矩阵中。

循环条件num <= n * m,当填充的数字大于矩阵内元素总数时结束循环,比如说3*3的矩阵,当我们填充的数字num = 10 的时候,大于3*3 = 9;10不在填入矩阵内。

squmat[row][col] = num;将1的值赋值到矩阵右上角;

num++随着循环变化调整所赋的值。

填入数字详细介绍:

向左填充:

if (change == 0)
{
	if (col > 0 && squmat[row][col] == 0)
	{
		col--;
	}
	else
	{
		row++;
		change = 1;
	}
}

上述代码实现向左填充数字,当满足col > 0 && squmat[row][col] == 0条件时,列数就减一列,这是因为我们是从右上角开始填充的数字,列数起始就是最后一列。

col > 0 && squmat[row][col] == 0解释

由于列数是逐渐递减的,因此当列数小于0的时候,就不满足填充条件了,squmat[row][col] == 0判断填充的下一个位置是否为0,如果不是0就不能填充,不是0的位置说明已经填充过数字了。

如果不满足填充条件,则跳到下一行,这时候我们填充数字的方向就要改变了,由原来的向左填充改为向下填充,change变为1。

squmat[row][col] == 0判断当前位置(由rowcol确定)的元素是否为 0。在螺旋矩阵的填充过程中,只有当该位置的元素为 0 时,才表示该位置还没有被填充过,才可以进行填充操作;如果该位置不为 0,说明已经被填充过了,需要改变填充方向。

图解:
b5df0896b886470295b6e3dbc75237db.jpeg

向下填充:

	else if (change == 1)
	{
		if (row < n - 1 && squmat[row + 1][col] == 0)
		{
			row++;
		}
		else
		{
			col++;
			change = 2;
		}
	}

当满足row < n - 1 && squmat[row + 1][col] == 0时,行数就加1行,向下填充,如果不满足该条件,列数增加,change改为2,开始向右填充。

row < n - 1 && squmat[row + 1][col] == 0解释:

1.row < n - 1

row < n - 1这个条件是判断当前行索引是否小于矩阵总行数减 1,这意味着还没有到达矩阵的最后一行。如果这个条件不满足,说明已经到了最后一行,不能再往下一行进行填充操作。

2.squmat[row + 1][col] == 0

(1)squmat[row + 1][col]表示当前位置的下一行同一列的元素。

(2)squmat[row + 1][col] == 0判断下一行同一列位置的元素是否为 0。如果是 0,则表示该位置还没有被填充数字,可以将数字按螺旋顺序填充到该位置;如果不是 0,则说明该位置已经被填充过,不能再填充,需要改变填充方向。

96b3d78503e94cb586bd0b51430048b4.jpeg

向右填充:

else if (change == 2)
{
	if (col < m - 1 && squmat[row][col + 1] == 0)
	{
		col++;
	}
	else
	{
		row--;
		change = 3;
	}
}

当满足col < m - 1 && squmat[row][col + 1] == 0条件,col就加1,向右填充,如果不满足该条件,行数减1,填入数字方向改为向上填充,change = 3。

col < m - 1 && squmat[row][col + 1] == 0理解:

  1. col < m - 1 部分

    • col是当前元素在矩阵中的列位置,m是矩阵的列数。col < m - 1这个条件用于判断当前列是否小于矩阵总列数减 1。
    • 这是因为在矩阵中,列索引从 0 开始,当col等于m - 1时,已经到达了矩阵最右侧的列,再向右就超出矩阵范围了。
  2. squmat[row][col + 1] == 0部分

    • squmat[row][col + 1]表示当前元素的右侧相邻元素(在同一行,列索引增加 1)。
    • squmat[row][col + 1] == 0 判断右侧相邻元素的值是否为 0。在蛇形矩阵填充算法中,值为 0 通常表示该位置尚未被填充数字。

向上填充:

	else if (change == 3)
	{
		if (row > 0 && squmat[row - 1][col] == 0)
		{
			row--;
		}
		else
		{
			col--;
			change = 0;
		}
	}

与上类似,就跳过了。

四、完整代码:

#include <stdio.h>
int main()
{
	int n = 0;
	int m = 0;
	scanf("%d %d", &n, &m);
	int squmat[m][m];
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < m; j++)
		{
			squmat[i][j] = 0;
		}
	}
	int num = 1;
	int row = 0; int col = m - 1;
	int change = 0;
	while (num <= n * m)
	{
		squmat[row][col] = num;
		num++;
		if (change == 0)
		{
			if (col > 0 && squmat[row][col] == 0)
			{
				col--;
			}
			else
			{
				row++;
				change = 1;
			}
		}
		else if (change == 1)
		{
			if (row < n - 1 && squmat[row + 1][col] == 0)
			{
				row++;
			}
			else
			{
				col++;
				change = 2;
			}
		}
		else if (change == 2)
		{
			if (col < m - 1 && squmat[row][col + 1] == 0)
			{
				col++;
			}
			else
			{
				row--;
				change = 3;
			}
		}
		else if (change == 3)
		{
			if (row > 0 && squmat[row - 1][col] == 0)
			{
				row--;
			}
			else
			{
				col--;
				change = 0;
			}
		}
	}
	for (int i = 0; i < n; i++)
	{
		for (int j = 0;j < m; j++)
		{
			printf("%d ", squmat[i][j]);
		}
	}
	return 0;
}

 

 

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

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

相关文章

Dropout正则化:提升PyTorch模型性能的神器!

本文展示了在PyTorch模型中添加Dropout正则化如何影响模型在损失和准确率方面的性能。 Dropout正则化在机器学习中的意义是什么&#xff1f; Dropout正则化是机器学习中的一种方法&#xff0c;通过在神经网络中随机丢弃一些单元&#xff08;神经元&#xff09;来模拟同时训练多…

explicit 的作用(如何避免编译器进行隐式类型转换)

目录 1. 隐式转换&#xff08;Implicit Conversion&#xff09; 2. 显式转换&#xff08;Explicit Conversion&#xff09; 3. 隐式转换的风险与显式转换的必要性 4. 隐式类型转换的例子 5. explicit 的作用 6. explicit 在构造函数中的作用 7. explicit 适用于转换操作…

常见网络层(卷积、池化、全连接)与其计算

卷积可视化&#xff1a;卷积神经网络 (CNN) 基本原理和公式_cnn公式-CSDN博客 嵌入大小计算规则【注意评论区全连接层计算规则勘误&#xff1a;Pv Wv Bv】 Conv、MaxPool、FC 池化操作和conv在kernels上计算不一致&#xff0c;在图像尺寸上的规则都是一样的。 公式可以理解…

解决windows远程桌面连接报错:这可能由于GredSSP加密数据库修正

这种问题需要修改一些远程端的安全级别 1.使用快捷键winr打开运行窗口 ------- 输入‘gpedit.msc’ 2.依次展开“计算机配置”->“管理模板”->“系统”->“凭据分配”设置名称&#xff1a; 加密数据库修正 3.双击“加密数据库修正”&#xff0c;将状态改为“启用”&a…

LDRA Testbed(TBrun)软件单元测试_实例讲解(对多次调用的函数打桩)

系列文章目录 LDRA Testbed软件静态分析_操作指南 LDRA Testbed软件静态分析_自动提取静态分析数据生成文档 LDRA Testbed软件静态分析_Jenkins持续集成&#xff08;自动静态分析并用邮件自动发送分析结果&#xff09; LDRA Testbed软件静态分析_软件质量度量 LDRA Testbed软件…

YOLOv10改进:CA注意力机制【注意力系列篇】(附详细的修改步骤,以及代码,目标检测效果优于SE和CBAM注意力)

YOLOv10改进&#xff1a;CA注意力机制【注意力系列篇】&#xff08;附详细的修改步骤&#xff0c;以及代码&#xff09; 如果实验环境尚未搭建成功&#xff0c;可以参考这篇文章 ->【YOLOv10超详细环境搭建以及模型训练&#xff08;GPU版本&#xff09;】 文章链接为&…

电脑pe是什么意思_电脑pe系统作用详细分析

有些小白很好奇&#xff0c;电脑pe是什么意思?所谓的电脑pe系统其实就是当我们的电脑出现问题而不能进入正常系统时候的一种“紧急备用”系统。如果需要重装操作系统的话&#xff0c;以往采用光盘使用的比较多&#xff0c;随着技术的进步&#xff0c;用u盘制作一个pe启动盘去安…

Kubernetes 系列 | k8s入门运维

目录 一、K8S集群搭建1.1 部署方式1.2 了解kubeadm1.3 部署流程1.3.1 初始化配置1.3.2 安装容器运行时1.3.3 安装K8S软件包1.3.4 创建集群 二、集群高可用1.1 集群高可用-堆叠1.2 集群高可用-集群外etcd 三、Pod运维3.1 Pod运维3.2 Pod的生命周期3.3 Pod状况3.4 Pod阶段3.5 容器…

【C++前缀和】3212. 统计 X 和 Y 频数相等的子矩阵数量|1672

本文涉及的基础知识点 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 LeetCode3212. 统计 X 和 Y 频数相等的子矩阵数量 难度分&#xff1a;1672 给你一个二维字符矩阵 grid&#xff0c;其中 grid[i][j] 可能是 ‘X’、‘Y’ 或 ‘.’&a…

中秋佳节,科技好礼献团圆!五款数码好物大推荐

中秋节的到来&#xff0c;总是让人充满了对团圆和美好生活的向往。在这个家人团聚、朋友欢聚的美好时刻&#xff0c;除了享受月饼和团圆饭&#xff0c;还可以通过一些先进的数码好物&#xff0c;提升节日的愉悦感和生活的舒适度。从提升运动体验的南卡Runner Pro5&#xff0c;到…

Windows系统 安装 Nacos

使用说明&#xff1a;安装 Nacos 服务端&#xff0c;以单机模式启动&#xff0c;不用集群。 一、下载Nacos Nacos Server 下载 | Nacos 官网 下载解压后&#xff1a; bin&#xff1a;启动脚本&#xff1b;conf&#xff1a;配置文件 这个文件可以修改端口、增加数据库连接等配…

从零到一:为未上架APP开通微信商户支付服务的步骤详解

随着移动支付的普及&#xff0c;微信商户支付已成为众多商家不可或缺的一部分。然而&#xff0c;对于某些仍处于开发阶段或特殊需求下的APP来说&#xff0c;它们可能尚未在应用商店上架&#xff0c;但仍需接入微信支付功能以满足用户需求。本文将为您提供一份详细的微信商户支付…

2024年印尼金融科技报告解读(1) | 印尼金融科技发展现状与挑战

概述 金融科技的创新正加速全球金融普及和经济增长&#xff0c;尤其在东南亚&#xff0c;其影响尤为显著。 印尼作为该区域的经济龙头&#xff0c;凭借其庞大的人口基数和独特的地理位置&#xff0c;对"非接触式"服务和中小企业融资的需求迅猛增长&#xff0c;成为数…

mp3和mp4区别是什么?音视频转换,用这2个工具就够了

在刷视频的时候&#xff0c;在看电影的时候&#xff0c;在听歌的时候……我们经常能听到“mp3”、“mp4”这两种格式的名字。它们是什么格式&#xff1f;mp3和mp4区别是什么&#xff1f;我们能做什么&#xff1f; mp3是一种流行的音频编码格式&#xff0c;以其高效的压缩算法著…

屏幕空间UV 警戒线

屏幕空间UV 警戒线 屏幕UV已经抗锯齿

ueditor抓取图片

在ueditor.all.js文件中 修改catchremoteimage方法 原来的: 修改后: function catchremoteimage(imgs, callbacks) { //创建一个请求var oReq = new XMLHttpRequest() //获取请求地址前缀,根据自身项目获取const baseURL = http://uat.********* //url为请求地址根路径+具…

openGauss 数据库管理工具:DataKit 6.0 部署与配置实战

目录 一、DataKit简述 二、部署概要 三、系统规划 四、软件环境准备 1、关闭防火墙 2、配置时间同步 3、禁用 SELinux 4、关闭RemoveIPC 5、字符集设置 6、安装依赖包 五、openGauss DataKit部署与配置 1、openGauss 安装与配置 1.openGauss参数配置 2.重启 open…

React Native 0.76,New Architecture 将成为默认模式,全新的 RN 来了

关于 React Native 的 New Architecture 概念&#xff0c;最早应该是从 2018 年 RN 团队决定重写大量底层实现开始&#xff0c;因为那时候 React Native 面临各种结构问题和性能瓶颈&#xff0c;最终迫使 RN 团队开始进行重构。 而从 React Native 0.68 开始&#xff0c;New A…

第三次去银行办事,核心是犯了抓不住重点这个毛病

手机银行不小心输错了两次密码&#xff0c;然后就限制了交易&#xff0c;只能在柜台操作。 由此引发了比如提示密码错误、定期转活期、转账等功能的异常。 前两次去银行&#xff0c;竟然只是去解决了这些附带问题。 核心问题是限制非柜面交易啊。 哎 这就是抓不住重点&…

数据结构-堆-详解

数据结构-堆-详解 1.性质大根堆小根堆 2.实现2.1struct Heap、HeapInit、HeapDestroy2.2HeapPushAdjustUp 2.3HeapPopAdjustDown 2.4HeapTop、HeapSize、HeapEmpty 3.应用3.1堆排建堆排序 3.2TopK问题 1.性质 堆是一种特殊的完全二叉树&#xff0c;其父节点总是不大于/不小于 …