1、盲听C哈说
都说数据结构与算法是编程的核心,它们两个是内功与心法😀,其它编程工具只是招式,学会了内功与心法,学习新事物(这里特指层出不穷的IT技术)就没有那么难了,实际上,对于一个编程人员,每天保持刷题(算法题 或者 一些简单的题保持手感)还是非常有必要的,基于此,决定新开一个栏目 — 🔍️C哈的刷题计划🔍️,带着大家一起来学习、做题、讨论,毕竟一个人的路难走,一群人才能够走得更远,希望渴望进步的你,能够和我一起,时刻保持竞争力,自然不会有职场焦虑📚️,在过去的几年时间里,我感觉自己的能力没有得到多大的进步,倒是情商提高了不少,大多数时候都是在处理人际关系,当我意识到这一点的时候,我感到非常糟糕,我们应该把更多的时间和经历放在个人成长上面,毕竟,天下熙熙,皆为利来;天下攘攘,皆为利往。
话不多说,今天做了一道题,是关于二维数组知识点的 — 输出数字螺旋矩阵,我们一起来看一下这道题的分析思路和代码实现。
2、问题描述
(1)题目描述
输入一个正整数N,生成一个N x N的螺旋矩阵,矩阵中元素取值为1 ~ ,1在左上角,其余各数按顺时针方向旋转前进,依次递增放置。
例如 当 N = 4 时,矩阵各元素如下:
1 | 2 | 3 | 4 |
12 | 13 | 14 | 5 |
11 | 16 | 15 | 6 |
10 | 9 | 8 | 7 |
(2)输入描述
输入占一行,为一个正整数N,1 <= N <=9。
(3)输出描述
输出N x N 大小的螺旋矩阵,即输出N行,每行有 N 个 数字,每个数字输出时占3个字符的宽度。
(4)样例输入
4
(5)样例输出
1 | 2 | 3 | 4 |
12 | 13 | 14 | 5 |
11 | 16 | 15 | 6 |
10 | 9 | 8 | 7 |
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列元素不用,所有元素都初始化为0int 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测试,可以找我要相关链接,电脑自动评测会更加准确~,好了,今天这篇文章就讲到这里,我们下期再见~