当前位置: 首页 > article >正文

C哈的刷题计划之输出数字螺旋矩阵(1)

1、盲听C哈说

        都说数据结构与算法是编程的核心,它们两个是内功与心法😀,其它编程工具只是招式,学会了内功与心法,学习新事物(这里特指层出不穷的IT技术)就没有那么难了,实际上,对于一个编程人员,每天保持刷题(算法题 或者 一些简单的题保持手感)还是非常有必要的,基于此,决定新开一个栏目 — 🔍️C哈的刷题计划🔍️,带着大家一起来学习、做题、讨论,毕竟一个人的路难走,一群人才能够走得更远,希望渴望进步的你,能够和我一起,时刻保持竞争力,自然不会有职场焦虑📚️,在过去的几年时间里,我感觉自己的能力没有得到多大的进步,倒是情商提高了不少,大多数时候都是在处理人际关系,当我意识到这一点的时候,我感到非常糟糕,我们应该把更多的时间和经历放在个人成长上面,毕竟,天下熙熙,皆为利来;天下攘攘,皆为利往。

        话不多说,今天做了一道题,是关于二维数组知识点的 — 输出数字螺旋矩阵,我们一起来看一下这道题的分析思路和代码实现。

2、问题描述

(1)题目描述

        输入一个正整数N,生成一个N x N的螺旋矩阵,矩阵中元素取值为1 ~ N^{2},1在左上角,其余各数按顺时针方向旋转前进,依次递增放置。

例如 当 N = 4 时,矩阵各元素如下:

1234
1213145
1116156
10987

(2)输入描述 

        输入占一行,为一个正整数N,1 <= N <=9。

 (3)输出描述 

        输出N x N 大小的螺旋矩阵,即输出N行,每行有 N 个 数字,每个数字输出时占3个字符的宽度

(4)样例输入

        4

(5)样例输出 

1234
1213145
1116156
10987

3、问题分析 

        这道题我们可以使用二维数组这一数据结构来解决,通过观察,我们发现,填数是按照顺时针方向填数,但是填的数的数量在不断减少📍,举个例子,比如一开始,向右填的是1 2 3 4,然后往下填5 6 7,再往右边填8 9 10,再往上填11 12,发现,填的数据的个数在不断减少,比如一开始是4个,然后是3个,然后是2个……

        那怎么办呢?我们可以来模拟一下从左上角开始按顺时针方向旋转前进并填数,在什么情况下我们需要填数呢? — 显然,当下一个位置非0(将二维数组初始化为0),就说明不能再往该方向填写数字了(已经到达填写数字的边界了),而是要切换到下一个方向继续填写数字🛳️。且在填写数据的时候不能超过最外围边界,那么边界怎么来表示呢?以向右为例,即y+1<=N,代表下一个位置在哪里,必须小于边界(当然在这里,二维数组不使用下标0,从下标1开始用起)。

        代码方面,可以考虑使用while循环,因为这题就是按条件循环嘛,整体来说,while比for更加合适,当然如果你硬着头皮要使用for,也没有人会阻止你啦~

4、代码实现

#include<bits/stdc++.h>
using namespace std;
int main()
{
	//n行n列,共n*n个数
	int n;  
	//第0行、0列元素不用,所有元素都初始化为0
	int a[20][20] = {0}; 
	//输入矩阵大小 n行n列 
	cin >> n; 
	//(x,y)代表当前位置(第x行,第y列) 
	int x = 1,y = 1;
	// cnt代表当前要填写的数据 
	int cnt = 0;  
	a[1][1] = 1; //初始化起始数据
	// 总共填写n*n个数,先把cnt+1再填数,当cnt==n*n时,退出循环 
	while(cnt < n*n) {
		//向右填充数据
		while(y+1<=n && a[x][y+1]==0)
		{
			a[x][y+1] = ++cnt;
			y++;
		} 
		//向下填充数据
		while(x+1<=n && a[x+1][y]==0)
		{
			a[x+1][y] = ++cnt;
			x++;
		} 
		//向左填充数据
		while(y-1>=1 && a[x][y-1]==0)
		{
			a[x][y-1] = ++cnt;
			y--;
		} 
		//向上填充数据
		while(x-1>=1 && a[x-1][y]==0)
		{
			a[x-1][y] = ++cnt;
			x--;
		} 
	} 
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			cout << setw(3) << a[i][j];
		}
		cout << endl;
	}
	return 0;
}

5、OJ测试

大家写完代码之后如果想要做OJ测试,可以找我要相关链接,电脑自动评测会更加准确~,好了,今天这篇文章就讲到这里,我们下期再见~


http://www.kler.cn/a/393749.html

相关文章:

  • 【算法一周目】双指针(2)
  • 学法减分交管12123模拟练习小程序源码前端和后端和搭建教程
  • 前端-同源与跨域
  • 网络安全-蓝队基础
  • ISAAC SIM踩坑记录--ubuntu 22.04操作系统安装
  • arkUI:遍历数据数组动态渲染(forEach)
  • LabVIEW环境监测系统
  • HDFS新增节点和删除datanode节点
  • 打造专业问答社区:Windows部署Apache Answer结合cpolar实现公网访问
  • Java后端请求想接收多个对象入参的数据方法
  • 数据仓库面试题集离线实时
  • 双 11 数据可视化:Pyecharts 与 Matplotlib 绘制商品价格对比及动态饼图
  • 企业一站式管理系统odoo的研究——系统搭建
  • BigDecimal为什么比int要好
  • 计算机网络(11)和流量控制补充
  • linux c/c++最高效的计时方法
  • Oracle 19c PDB克隆后出现Warning: PDB altered with errors受限模式处理
  • 花了36元给我的个人博客上了一道防御
  • 单元测试、集成测试、系统测试、验收测试、压力测试、性能测试、安全性测试、兼容性测试、回归测试(超详细的分类介绍及教学)
  • 【操作系统】守护进程
  • 多模态大模型(2)--BLIP
  • 基于springboot的物品回收系统
  • 动手学深度学习69 BERT预训练
  • vue3入门知识(二)
  • Linux 网络编程
  • 开源模型应用落地-qwen模型小试-Qwen2.5-7B-Instruct-tool usage入门-集成心知天气(二)