矩阵问题讨论(一)

一.矩阵的转置问题

int arr[2][3]={{1},{3}};

1 3 0
0 0 0

转置后:

1 0 0
3 0 0

int arr[4][4]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};

1 0 0
3 0 0

转置后:

0 1 2 3
4 5 6 7
8 9 10 11
12 13 14 15

转置后:

0 4 8 12
1 5 9 13
2 6 10 14
3 7 11 15

集合两个例子会发现,转置问题实际上就是将arr[i][j]转置为arr[j][i]

编程实现:

#define _CRT_SECURE_NO_WARNINGS 1
#include  
int main()
{
    //以例二为例子转置
    int arr[4][4] = { {0,1,2,3},{4,5,6,7},{8,9,10,11},{12,13,14,15} };
    int i = 0;
    int j = 0;
    for (i=0; i < 4; i++)
    {
        for (j=0; j < 4; j++)
        {
            printf("%d ", arr[j][i]);
        }
    }
    printf("\n");
    return 0;
}

二.矩阵元素定位.

这是矩阵中比较简答的一类问题,只需要按照要求去输入输出即可

以牛客题为例;

矩阵元素定位_牛客题霸_牛客网

编程实现:

#include 
//第一行包含两个数n和m,表示这个矩阵包含n行m列。
// 从2到n+1行,每行输入m个整数(范围-231~231-1),用空格分隔,共输入n*m个数,表示矩阵中的元素。
// 接下来一行输入x和y,用空格分隔,表示KiKi想得到的元素的位置
#include 
int main()
{
    int n = 0;
    int m = 0;//初始化
    //输入
    scanf("%d %d", &n, &m);
    int arr[n][m];//变长数组不能初始化
    int i = 0;
    int j = 0;
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < m; j++)
        {
            scanf("%d", &arr[i][j]);
        }
    }
    //输入x,y
    int x = 0;
    int y = 0;
    scanf("%d %d", &x, &y);
    //输出
    printf("%d", arr[x - 1][y - 1]);//注意数组与x,y对应关系
    return 0;
}

三.矩阵镜面转换.

00 01 02 03 04 05
10 11 12 13 14 15
20 21 22 23 24 25
30 31 32 33 34 35
40 41 42 43 44 45
50 51 52 53 54 55

3.1.水平镜面转换.

如图转换后:

05 04 03 02 01 00
15 14 13 12 11 10
25 24 23 22 21 20
35 34 33 32 31 30
45 44 43 42 41 40
55 54 53 52 51 50

编程实现;

#define _CRT_SECURE_NO_WARNINGS 1
#include 
int main()
{
    //水平镜面转换
    int arr[6][6] = { {00,01,02,03,04,05},{10,11,12,13,14,15},{20,21,22,23,24,25},{30,31,32,33,34,35},{40,41,42,43,44,45},{50,51,52,53,54,55} };
    //输入
    //转换
    int i = 0;
    int j = 0;
    for (i = 0; i < 6; i++)
    {
        for (j = 0; j < 3; j++)//注意j<3,取一半
        {
            int tmp = 0;
            tmp=arr[i][j];
            arr[i][j] = arr[i][6 - j-1];
            arr[i][6 - j-1] = tmp;
        }
    }
    //输出
    for (i = 0; i < 6; i++)
    {
        for (j = 0; j < 6; j++)
        {
            printf("%d ", arr[i][j]);
           
        }
        printf("\n");
    }

    return 0;
}

我们不难发现,水平镜面转换即为arr[i][o]与arr[i][最后一个元素]转换

但要注意循环中j是小于一半(偶数),如果为奇数,则是总数先-1再/2;

3.2.垂直镜面转换.

借鉴水平镜面转换解题:

垂直镜面转换后;

50 51 52 53 54 55
40 41 42 43 44 45
30 31 32 33 34 35
20 21 22 23 24 25
10 11 12 13 14 15
00 01 02 03 04 05

编程实现;

#define _CRT_SECURE_NO_WARNINGS 1
#include 
int main()
{
    //垂直镜面转换
    int arr[6][6] = { {00,01,02,03,04,05},{10,11,12,13,14,15},{20,21,22,23,24,25},{30,31,32,33,34,35},{40,41,42,43,44,45},{50,51,52,53,54,55} };
    //输入
    //转换
    int i = 0;
    int j = 0;
    for (j = 0; j < 6; j++)
    {
        for (i = 0; i < 3; i++)//注意i<3,取一半
        {
            int tmp = 0;
            tmp=arr[i][j];
            arr[i][j] = arr[6-1-i][j];
            arr[6-1-i][j] = tmp;
        }
    }
    //输出
    for (i = 0; i < 6; i++)
    {
        for (j = 0; j < 6; j++)
        {
            printf("%-3d ", arr[i][j]);//-3d左对齐
           
        }
        printf("\n");
    }

    return 0;
}

读者可以试试先水平镜面转换,再垂直镜面转换!!!

四.序列矩阵重组.

此类题较为简单,只需要按照要求输入输出即可

序列重组矩阵_牛客题霸_牛客网(以此题为例)

法一:利用数组求解

#define _CRT_SECURE_NO_WARNINGS 1
#include 
int main()
{
    //输入两个整数n和m,用空格分隔,第二行包含n*m个整数
    int n = 0;
    int m = 0;
    scanf("%d %d", &n, &m);
    int i = 0;
    int j = 0;
    int arr[n][m];//不能初始化
    for (i = 0; i < n ; i++)
    {
        for (j = 0; j < m; j++)
        {
            scanf("%d", &arr[i][j]);

        }
           
    }
    //打印
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < m; j++)
        {
            printf("%d ", arr[i][j]);
        }
        printf("\n");
    }
    return 0;
}

法二;(由于VS2022无法用变长数组,因此,我们再来个不用数组的解法)

此法比法一简单

#define _CRT_SECURE_NO_WARNINGS 1
#include 
int main()
{
    int n = 0;
    int m = 0;
    //输入n,m
    scanf("%d %d", &n, &m);
    int i = 0;
    int j = 0;
    //输入n*m个数
    for (i = 0; i < (n * m); i++)
    {
        scanf("%d", &j);
        printf("%d ", j);
        if (i % m == 0)
        {
            printf("\n");
        }
    }
    return 0;
}

五.矩阵相等判断.

该类题只需要判断两个数组是否每个元素都相等即可!!

以牛客题为例:

矩阵相等判定_牛客题霸_牛客网

#define _CRT_SECURE_NO_WARNINGS 1
#include 
int main()
{
    //第一行包含两个整数n和m,表示两个矩阵包含n行m列
    int n = 0;
    int m = 0;
    scanf("%d %d", &n, &m);
    //从2到n + 1行,每行输入m个整数,用空格分隔,共输入n * m个数,表示第一个矩阵中的元素。
    //从n + 2行到2n + 1,每行输入m个整数,用空格分隔,共输入n * m个数,表示第二个矩阵中的元素
    int arr1[n][m];
    int arr2[n][m];
    int i = 0;
    int j = 0;
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < m; j++)
        {
            scanf("%d", &arr1[i][j]);
        }
        printf("\n");
    }
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < m; j++)
        {
            scanf("%d", &arr2[i][j]);
        }
        printf("\n");
    }
    //输出,一行,如果两个矩阵相等输出"Yes"并换行,否则输出"No"并换行
    int flag = 1;//假设相等
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < m; j++)
        {
            if (arr1[i][j]!= arr2[i][j])
            {
                flag = 0;
                break;
            }
        }
    }
    if (0 == flag)
    {
        printf("No\n");

    }
    
    if (1 == flag)
    {
        printf("Yes\n");
    }
    return 0;
}

最后:学习路上加油!!!喜欢给个三连呗!!!跪求了!!!(一周之内会出第二部分,比第一部分可能难点,加油,不放弃)

你可能感兴趣的:(矩阵,算法,线性代数)