前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >蛇形矩阵和矩阵转置

蛇形矩阵和矩阵转置

作者头像
aosei
发布2024-01-23 13:14:38
1090
发布2024-01-23 13:14:38
举报
文章被收录于专栏:csdn-nagiY

一.矩阵转置

1.问题呈现:

示例:

2.实现方法

首先我们需要一个·大小可变的二维数组,具体的定义方法请参考:http://t.csdn.cn/3XvSL

代码:

代码语言:javascript
复制
    int arr[20][20];
	int n = 0, m = 0;
	scanf("%d %d", &n, &m);  //输入行和列
	int i = 0, j = 0;
	for (i = 0; i < n; i++)    //初始化数组
	{
		for (j = 0; j < m; j++)
		{
			scanf("%d", &arr[i][j]);
		}
	}

那具体该怎么实现矩阵转置呢?

从示例中我们可以看出由本来的2行3列经转置后变成了3行2列,且数组中元素的存放内存是连续的,其实转置只是一种视觉效果,数组中元素的内存没有发生改变,只是打印数组的时候呈现的转置的结果。所以我们可以利用这一点解决问题。想要利用内存,我们就需要使用指针来处理,

我们知道数组名表示数组首元素的地址,而二维数组首元素的地址指的是第一行的地址,要想真正使用二维数组的第一个元素的地址,可以这样定义: int *p=&arr[0][0];

下面来看代码:

代码语言:javascript
复制
 int* p = &arr[0][0];
for (i = 0; i < m; i++)   //转置后的矩阵行和列刚好相反
{   
		
		for (j = 0; j < n; j++)
	{
		printf("%d ",*(p+i+j*20));   //这里的20就是你之前定义数组的列的大小,不可以写成其他的
	}
		printf("\n");
}

如果 *(p+i+j*20)写成 *(p+i+j*m)就会出现这样的结果:

发现第二列的数字很奇怪,这是为什么?

通过监视我们发现1,2,3,4,5,6不是连续存储的,由于定义动态数组的方法是间接的,不能算的是完全意义上的动态数组,所以会出现这种情况。

上面这种打印方式不免有些复杂,且容易出错,下面介绍一种简单的方法:

只需将printf的部分改掉就行了,转置后行和列是相反的,那我们打印的时候行和列也是相反的不就行了,这张方法简洁易懂,且不易出错。

二.蛇形矩阵

1.问题呈现:

2.实现方法:

蛇形矩阵的第一行和最后一列与内部的元素关联性不是特别强,且内部元素的排列富有规律,所以我们先赋值第一行和最后一列,这很简单:

代码语言:javascript
复制
    int arr[20][20];
	int n = 0, i = 0, j = 0,count=1;  //count用来记录数字的变化,实现数字的递增
	scanf("%d", &n);
    //打印第一行
	for (j=0; j < n; j++,count++)    //count++不能忘记写,不然数据会不对
	{
		arr[0][j] = count;
	}
    //打印最后一列
	for (i = 1; i < n; i++,count++)
	{
		arr[i][n-1] = count;
	}

接下来我们只需对数组的n-1行,n-1列进行赋值,所以我们总共循环 n-1 次,注意这里只能选择从最后一行给数组赋值,若是从第二行开始就不符合蛇形矩阵的定义。i要赋值成 i=n-1,才可以从最后一行开始赋值。

那最后一行该怎么正确赋值呢?

仔细观察数字的特点,我们发现是从后往前赋值的,赋值完一行后对上一行进行从前向后赋值,请看具体代码:

代码语言:javascript
复制
    i = n - 1;   //使数组从最后一行开始赋值
	while (i>0)  //控制循环次数
	{
		for (j = n - 2; j >= 0; j--,count++)   //从后向前赋值
		{
			arr[i][j] = count;
		}
		i--;        //赋值上一行
		for (j = 0; j <= n - 2; j++, count++)  //从前向后赋值
		{
			arr[i][j] = count;
		}
		i--;  //赋值上一行
	}

注意count++是一直存在的,最关键的部分完成了,之后就是打印数组了,来看完整代码和最终效果:

这里的%3d是为了打印出来的蛇形矩阵更好看,你可以你根据你自己的看法修改。

本篇文章就到这里啦,谢谢你的阅读。

如有错误或者是建议,欢迎小伙伴们指出。

拜拜~

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-12-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一.矩阵转置
    • 二.蛇形矩阵
    相关产品与服务
    对象存储
    对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档