矩阵作为线性代数核心内容之一也是刷题人时常会遇到的一种类型。本篇博客简单介绍一下矩阵转置、上三角矩阵以及杨氏矩阵。
1.转置矩阵:输入m行n列的矩阵以n行m列的方式打印出来。只要将数组的行列进行交换即可,并不难想也不难写.(相应练习:牛客网BC107)
#include<stdio.h>
int main()
{
int n = 0;
int m = 0;
scanf("%d%d", &n, &m);
int arr[10][10] = { 0 };
int i = 0;
int j = 0;
for (i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
{
scanf("%d", &arr[i][j]);
}
}
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
{
printf("%d ", arr[j][i]);
}
printf("\n");
}
return 0;
}
2.上三角矩阵:对角线以下所有元素都为零,但凡有一个元素非零就不是上三角(相应练习:BC106)
#include<stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
int arr[10][10] = { 0 };
int flag = 1;//表示是上三角
//读取元素
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
scanf("%d", &arr[i][j]);
}
}
//数据读取完毕后开始判断
for (int i = 0; i < n; i++)
{
//对角线的位置i与j下标一样,这也就说明当j小于i时元素位于对角线下方
for (int j = 0; j < i; j++)
{
if (arr[i][j] != 0)//但凡对角线以下存在不为零的元素就表示不是上三角
{
flag = 0;
goto end;
}
}
}
end:
if (flag == 1)
printf("YES\n");
else
printf("NO\n");
return 0;
}
3.杨氏矩阵:有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的,请编写程序在这样的矩阵中查找某个数字是否存在。要求:时间复杂度为:O(n)
因为时间复杂度的要求,遍历数组的办法是不可行的。因此要采用特殊位置比较的方法。
代码如下:
#include<stdio.h>
int mat_find(int arr[3][3], int* px, int* py, int k)
{
int x = 0;
int y = *py-1;
while (x <= (*px) - 1 && y >= 0)
{
if (arr[x][y] < k)
{
x++;
}
else if(arr[x][y]>k)
{
y--;
}
else
{
*px = x;
*py = y;
return 1;
}
}
return 0;
}
int main()
{
int arr[3][3] = { 1,2,3,4,5,6,7,8,9 };
int k = 0;//查找元素
int a = 3;
int b = 3;
scanf("%d", &k);
int ret = mat_find(arr, &a, &b, k);
if (ret == 1)
printf("%d %d \n",a,b);
else
printf("找不到\n");
return 0;
}
此代码通过改变a,b的位置来实现输出要寻找元素的下标,这样有一个缺陷就是:在二次调用mat_find之前要先将a和b的值重置,否则会导致查找失败。
结束语:
线代的学习因为疫情的原因是躲在屏幕后面上网课,导致我忘的比学的还快,因此很烦矩阵,不知道各位如何看待。那么今天的博客就写(水)到这里了,你学废了吗?
版权声明:本文为m0_62633482原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。