[{"createTime":1735734952000,"id":1,"img":"hwy_ms_500_252.jpeg","link":"https://activity.huaweicloud.com/cps.html?fromacct=261f35b6-af54-4511-a2ca-910fa15905d1&utm_source=V1g3MDY4NTY=&utm_medium=cps&utm_campaign=201905","name":"华为云秒杀","status":9,"txt":"华为云38元秒杀","type":1,"updateTime":1735747411000,"userId":3},{"createTime":1736173885000,"id":2,"img":"txy_480_300.png","link":"https://cloud.tencent.com/act/cps/redirect?redirect=1077&cps_key=edb15096bfff75effaaa8c8bb66138bd&from=console","name":"腾讯云秒杀","status":9,"txt":"腾讯云限量秒杀","type":1,"updateTime":1736173885000,"userId":3},{"createTime":1736177492000,"id":3,"img":"aly_251_140.png","link":"https://www.aliyun.com/minisite/goods?userCode=pwp8kmv3","memo":"","name":"阿里云","status":9,"txt":"阿里云2折起","type":1,"updateTime":1736177492000,"userId":3},{"createTime":1735660800000,"id":4,"img":"vultr_560_300.png","link":"https://www.vultr.com/?ref=9603742-8H","name":"Vultr","status":9,"txt":"Vultr送$100","type":1,"updateTime":1735660800000,"userId":3},{"createTime":1735660800000,"id":5,"img":"jdy_663_320.jpg","link":"https://3.cn/2ay1-e5t","name":"京东云","status":9,"txt":"京东云特惠专区","type":1,"updateTime":1735660800000,"userId":3},{"createTime":1735660800000,"id":6,"img":"new_ads.png","link":"https://www.iodraw.com/ads","name":"发布广告","status":9,"txt":"发布广告","type":1,"updateTime":1735660800000,"userId":3},{"createTime":1735660800000,"id":7,"img":"yun_910_50.png","link":"https://activity.huaweicloud.com/discount_area_v5/index.html?fromacct=261f35b6-af54-4511-a2ca-910fa15905d1&utm_source=aXhpYW95YW5nOA===&utm_medium=cps&utm_campaign=201905","name":"底部","status":9,"txt":"高性能云服务器2折起","type":2,"updateTime":1735660800000,"userId":3}]
<>蛇形矩阵这道算法题大家应该都遇到过,对于大部分初学者来说是一个比较难的题(包括博主),今天来分享一下解决这道题的简单算法(认真看就一定能看懂!!!)
<>首先我们来分析一下这道题目:
<>思路:
这样的矩阵我们称为蛇形矩阵
<>数字在矩阵中填充的顺序像一条蛇一样,我们可以模拟数字填充的方法,
我们都玩过贪吃蛇小游戏,只不过我们这条贪吃蛇足够聪明,有固定的起点,而且遇到边界会自动调整方向(按顺时针方向旋转)并且不会吃到自己的身体,它可以在给定区域内形成最大长度(身体不允许重叠的情况下)
,以上图为例我们的起点为1,向右走到4后即遇到边界开始向下走,向下遇到边界向左走然后向上走······,此时它走过的地方成为新的边界,按照这种方法就可以完成矩阵的填充。
<>代码如下:
#include<stdio.h> int main() { int m,n; //m行n列的蛇形矩阵 scanf("%d%d",&m,&n); int
dx[] = {-1,0,1,0}; int dy[] = {0,1,0,-1}; //dx和dy数组用于调整方向 int g[110][110] = {0};
//初始化数组元素全为0 int x = 0,y = 0,d = 1; for(int i = 1;i <= m*n;i ++) { g[x][y] = i;
int a= x + dx[d]; //开始时先向右移,所以从d=1开始 int b = y + dy[d]; //a和b记录要移动到的位置 if(a < 0
|| a >= m || b < 0 || b >= n || g[a][b]) //边界处理,如果满足这四种条件中的一种,即越界,需要改变方向。 { d =
(d + 1) % 4; //顺时针改变方向操作 a = x + dx[d]; b = y + dy[d]; } x = a; y = b; } for(
int i= 0;i < m;i ++) //输出蛇形矩阵 { for(int j = 0;j < n;j ++) printf("%d ",g[i][j]);
printf("\n"); } }
时间复杂度:O(m*n)
空间复杂度:O(1)
<>这段代码不好理解的地方就是边界处理和方向调整,开始是向右然后遇到边界d =
(d+1)%4,再由dx[d],dy[d]重新确定移动方向,边界处理的条件就是不能越界,到算法中实现就是
<>1 .要填充数字的位置下标不能小于0.
<>2 . 要填充数字的位置行数必须小于m,列数必须小于n.
<>3.要填充数字的位置未填充过数字.
<>相信仔细思考后你一定理解了这段代码,并对矩阵问题有了更深刻的理解,可以利用上述代码改变方向的方式高效地做出类似算法题。快去刷题吧!