大家好,今天我们来练习二维数组,数组的话,今天的内容大家下来需要自己好好思考多加理解,多自己动手,才能更好的掌握,话不多说,开始正题
本篇使用方法:
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;
}
大家自己动手做矩阵乘法了吗,怎么样,感受到二维数组的魅力了吗,小伙伴们一定要多练习,加油加油加油
今天也以一句话结束和大家共勉
“一个人使劲踮起脚尖靠近太阳的时候,全世界都挡不住她的阳光。”