两道C语言二维数组练习的题目(蛇形填数&矩阵乘法)

本文介绍了如何通过编程实现二维数组的蛇形填充算法以及矩阵乘法,强调了动手实践和理解算法的重要性。
摘要由CSDN通过智能技术生成

大家好,今天我们来练习二维数组,数组的话,今天的内容大家下来需要自己好好思考多加理解,多自己动手,才能更好的掌握,话不多说,开始正题


本篇使用方法:

1.对二维数组不了解可以看我之前写的数组那篇文章,先对一维数组和二维数组有个了解,链接放在这里,大家不会可以点进去看 http://t.csdnimg.cn/SUE7u

2.大体流程是先看题目,自己先动手操作,如果做不出来看解题思路,如果还是有问题最后看解题代码

一、蛇形填数 

1.题目如下

题目:

输入一个数字n,在n*n的方阵里填入1,2,......,n*n,要求填成蛇形,例如当n = 3时

                                             

输入样例:

                4

输出样例:

                10        11        12        1

                 9         16        13        2

                 8         15        14        3

                 7          6          5         4        

2.解题思路

很明显,这里的题目我们需要一个 4 * 4 的数组,根据对蛇形规律的了解,它的规律是先从第一行最后一个1开始,先向下,再向左,再向上,再向右,这样如此循环,那么我们应该怎么写这个循环呢

其实我们可以先这样想,它一共要填入16个数字,那么最开始就循环16次,在这里面,我们要根据填入数字的方向来写一个判断条件,从最开始1开始,向下填入,直到最后一行比总行数小(不等于的原因是从1开始向下填的时候,x = 0),之后向左走,那么在最后一列到第二列,让其继续填入数字,再从第一行向右走,再到倒数第二行,然后继续向下,这样把每次都写成循环(因为如果满足第一次的条件,那么后面继续填数字的时候行和列是一直符合条件的),就可以写出代码了

3.代码如下 

#include <stdio.h>
#include <string.h>

int main()
{
	int n = 0, x = 0, y = 0;
	scanf("%d",&n);
	int a[n][n];
	memset(a, 0, sizeof(a)); //这里的意思是初始化数组a,使元素全部为0
	a[x = 0][y = n - 1] = 1;
	int sum = 1; 
	while(sum < n*n)
	{
		while(x + 1 < n && a[x+1][y] == 0)
		{
			a[++x][y] = ++sum;
		}
		while(y - 1 >= 0 && a[x][y - 1] == 0)
		{
			a[x][--y] = ++sum;
		}
		while(x - 1 >= 0 && a[x-1][y] == 0)
		{
			a[--x][y] = ++sum;
		}
		while(y + 1 < n && a[x][y + 1] == 0)
		{
			a[x][++y] = ++sum;
		}
	}
	for(x = 0; x < n; x++)
	{
		for(y = 0; y < n; y++)
		{
			printf("%-4d",a[x][y]); //这里的%-4d是左对齐,%4d是右对齐
		}
		printf("\n");
	}
	
	return 0;
}

恭喜你通了第一关,第二关,嘿嘿嘿,准备好了吗!!! 

二、矩阵乘法

1.题目如下

题目:

输入m1行n1列的一个矩阵,再输入m2行,n2列的一个矩阵,输出两个矩阵相乘得到的新的矩阵,如果不能相乘则输出“输入的矩阵无法相乘”

PS:我们通常认为 n1 和 m2 不相等的时候,不能相乘

(可能有些小伙伴不知道矩阵乘法是什么,这里画个图方便大家理解,如果还是不懂,大家就去搜一下,只知道怎么乘的就行)

输入样例:

3        2

//这里怕大家不理解上一行的输入,我解释一下这个意思是输入第一个矩阵的m1行n1列

1        2        3

2        1        1

3        2

//这里怕大家不理解上一行的输入,我解释一下这个意思是输入第二个矩阵的m2行n2列

3        1

1        2

2        1

输出样例:

        11        8

         9         5

2.解题思路

这道题我们可以把它拆解成三部分

第一部分是输入二维数组

第二部分是判断二维数组能不能做乘法,如果不行就输出题目中的格式,如果可以就进入矩阵乘法

第三部分是输出二维数组

3.代码如下

#include <stdio.h>
int main()
{
	int m1 = 0, n1 = 0, m2 = 0, n2 = 0, sum = 0;
	//输入第一个矩阵 
	scanf("%d %d ",&m1,&n1);
	int a1[m1][n1];
	for (int i = 1; i <= m1; i++)
	{
 		for (int j = 1; j <= n1; j++)
		{
			int m = 0;
			scanf("%d",&m);
			a1[i - 1][j - 1] = m; 
		}
	}
	//输入第二个矩阵 
	scanf("%d %d ",&m2,&n2);
	int a2[m2][n2];
	for (int i1 = 1; i1 <= m2; i1++)
	{
 		for (int j1 = 1; j1 <= n2; j1++)
		{
			int m0 = 0;
			scanf("%d",&m0);
			a2[i1 - 1][j1 - 1] = m0; 
		}
	}
	
	//矩阵的乘法
	int s[m1][n2];	
	if(n1 != m2)
	{
		printf("输入的矩阵无法相乘");
	}
	else
	{
	for (int k = 1; k <= m1; k++)
	{
		for (int p = 1; p < n1; p++)
		{
			for (int q = 1; q <= m2; q++)
			{
				sum += a1[k-1][q-1] * a2[q-1][p-1];
			}
			s[k-1][p-1] = sum;
		//	printf("%d ",sum);
			sum = 0;
		}
		
			
	}
	}
	
	//输出数组
	for (int f = 1; f <= m1; f++) 
	{
		for (int h = 1; h <= n2; h++)
		{
			printf("%4d",s[f-1][h-1]);
		}
		printf("\n");
	}
 	return 0;
}

大家自己动手做矩阵乘法了吗,怎么样,感受到二维数组的魅力了吗,小伙伴们一定要多练习,加油加油加油


今天也以一句话结束和大家共勉

一个人使劲踮起脚尖靠近太阳的时候,全世界都挡不住她的阳光。” 

  • 48
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Re.不晚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值