c语言经典习题之矩阵

这一篇文章我来讲一些矩阵的相关基础题。

目录

矩阵元素定位

 序列重组矩阵

 方法一:

方法二:

矩阵相等判定

上三角矩阵判定

转置矩阵

矩阵交换

杨辉三角


矩阵元素定位

​​​​​​矩阵元素定位_牛客题霸_牛客网 (nowcoder.com)

  • 思路很简单就是遍历整个数组然后如果由于它找的那个元素相等就打印,这里要注意的是,我们看见的行和列与二维数组中的行和列不一样,所以我们在比较的时候要将输入的行和列减1在与遍历的行和列比较。
  • 当然看到这个题我们也能想到杨氏矩阵那个做法,但是因为我们这个题目矩阵不一定是行和列全部递增的,所以我们不能用那种做法,但是这也可以让你回顾一下做法,现在你能敲出来杨氏矩阵那种做法么?
#include<stdio.h>
int main()
{
    int m=0;
    int n=0;
    int arr[5][5]={0};
    scanf("%d %d",&m,&n);
    int i=0;
    for(i=0;i<m;i++)
    {
        int j=0;
        for(j=0;j<n;j++)
        {
            scanf("%d",&arr[i][j]);
        }
    }
    int x =0;
    int y =0;
    scanf("%d %d",&x,&y);
    for(i=0;i<m;i++)
    {
        int j=0;
        for(j=0;j<n;j++)
        {
            if(arr[x-1][y-1]==arr[i][j])//行和列减一才是真正二维数组元素的位置
            {
                printf("%d",arr[i][j]);
                break;//打印完立马跳出循环
            }
        }
    }
    return 0;
}

 序列重组矩阵

序列重组矩阵_牛客题霸_牛客网 (nowcoder.com)

 方法一:

  • 一种方法我们可以直接打印成二维数组的样子,反正系统不会管你是怎么输入的。当然这种方法有点投机取巧还是不推荐的。
#include<stdio.h>
int main()
{
    int m=0;
    int n=0;
    scanf("%d %d",&m,&n);
      int arr2[10][10]={0};
    int i=0;
    for(i=0;i<m;i++)
    {
        int j=0;
        for(j=0;j<n;j++)
        {
            scanf("%d",&arr2[i][j]);
        }
    }
    for(i=0;i<m;i++)
    {
        int j=0;
        for(j=0;j<n;j++)
        {
            printf("%d ",arr2[i][j]);
        }
        printf("\n");
    }
    return 0;
}

方法二:

  • 我们可以每输入一次数然后打印一次,当我们输入行的边界的时候我们就换行,这里需要注意的是i刚开始不能为0要不第一次就打印换行了。
#include<stdio.h>
int main()
{
    int m=0;
    int n=0;
    scanf("%d %d",&m,&n);
    int i=0;
    int num=0;
    for(i=1;i<=m*n;i++)//i从1开始防止第一次就换行
    {
        scanf("%d",&num);
        printf("%d ",num);
        if(i%n==0)//当到达行的边界时候就换行
        {
            printf("\n");
        }
    }
    return 0;
}

矩阵相等判定

矩阵相等判定_牛客题霸_牛客网 (nowcoder.com)

  •  思路很简单就是遍历连个二维数组看每个元素是否相等,然后记录个数,如果最后等于一个数组中的元素个数两个矩阵就相等,反之不相等。
#include<stdio.h>
int main()
{
    int n = 0;
    int m = 0;
    scanf("%d %d", &n, &m);
    int arr1[10][10] = { 0 };
    int arr2[10][10] = { 0 };
    int i = 0;
    int j = 0;
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < m; j++)
        {
            scanf("%d", &arr1[i][j]);
        }
    }
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < m; j++)
        {
            scanf("%d", &arr2[i][j]);
        }
    }
    int count = 0;
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < m; j++)
        {
            if (arr1[i][j] == arr2[i][j])//遍历两个二维数组里的元素相不相等
            {
                ++count;
            }
        }
    }
    if (count == m * n)//相等的元素是否等于一个二维数组的总元素个数
    {
        printf("Yes\n");
    }
    else {
        printf("No\n");
    }
    return 0;
}

上三角矩阵判定

上三角矩阵判定_牛客题霸_牛客网 (nowcoder.com)

思路:根据上三角矩阵的规律

所以我们只需要判断i>j时候都是不是0。

#include<stdio.h>
int main()
{
    int n=0;
    scanf("%d",&n);
    int i=0;
    int arr[10][10] ={0};
    for(i=0;i<n;i++)
    {
        int j=0;
        for(j=0;j<n;j++)
        {
            scanf("%d",&arr[i][j]);
        }
    }
     for(i=0;i<n;i++)
    {
        int j=0;
        for(j=0;j<n;j++)
        {
            if(i>j&&arr[i][j]!=0)
            {
               printf("NO\n");
               return 0;//因为是两层循环一个break跳不出去,所以用return0;
                        //那能不能用break呢?当然也可以只不过要在第一层循环里在判断一下。
            }
        }
    }
    printf("YES\n");
    return 0;
}

转置矩阵

​​​​​​矩阵转置_牛客题霸_牛客网 (nowcoder.com)

思路: 

 可以观察元素对应的下标,行和列都是与原来是反着来的,当然我们也可以反其道而行之就这个思路来,我们可以把行和列的总个数交换,然后也对应下标反过来(即i,j变成j,i);

#include<stdio.h>
int main()
{
    int arr[10][10]={0};
    int m=0;
    int n=0;
    scanf("%d %d",&m,&n);
    int i=0;
    int j=0;
    for(i=0;i<m;i++)
    {
        for(j=0;j<n;j++)
        {
            scanf("%d",&arr[i][j]);
        }
    }
    
    for(i=0;i<n;i++)//行和列总数交换
    {
        for(j=0;j<m;j++)
        {
            printf("%d ",arr[j][i]);//由i,j变成j,i
        }
        printf("\n");
    }
    return 0;
}

当然我没有想到上面那种思路,我刚开始想的是将两个坐标(即i,j和j,i)下标元素交换,但是没有通过全部用例我这种做法只适合行和列相等的时候做。

虽然没有成功,但是下次遇到n*n的矩阵我们也可以做,下面给一个函数的代码;

void swap(int* a, int* b)
 {                   
    int tmp = *a;
    *a = *b;
    *b = tmp;
}

void maxtrixT(int n, int mat[][n]) 
{        
    int i, j;
    for(i = 0; i < n; ++i) {
        for(j = i; j < n; ++j) {             
            swap( &mat[i][j], &mat[j][i] );  
        }
    }
}

矩阵交换

矩阵交换_牛客题霸_牛客网 (nowcoder.com)

  •  思路:根据他的要求输入,然后当字母为r的时候就交换行,当字母为c的时候交换列

交换行:列不变进行交换(记得他输入坐标和二维数组中真正的坐标差1所以进行交换的时候要减去);

交换列:行不变;

#include<stdio.h>
int main()
{
    int n=0;
    int m=0;
    scanf("%d %d",&n,&m);
    int i=0;
    int j=0;
    int arr[10][10]={0};
    for(i=0;i<n;i++)
    {
        for(j=0;j<m;j++)
        {
            scanf("%d",&arr[i][j]);
        }
    }
    int k =0;
    char t =0;
    int a =0;
    int b =0;
    scanf("%d",&k);
    for(i=0;i<k;i++)
    {
        scanf(" %c %d %d",&t,&a,&b);
        if(t=='r')//交换行
        {
            for(j=0;j<m;j++)
            {
                int tmp = arr[a-1][j];
                arr[a-1][j] = arr[b-1][j];
                arr[b-1][j] = tmp;
            }
        }
        
        else if(t=='c')//交换列
        {
            for(j=0;j<n;j++)
            {
                int tmp = arr[j][a-1];
                arr[j][a-1] = arr[j][b-1];
                arr[j][b-1] = tmp;
            }
        }
    }
    for(i=0;i<n;i++)
    {
        for(j=0;j<m;j++)
        {
            printf("%d ",arr[i][j]);
        }
        printf("\n");
    }
    return 0;
}

杨辉三角

杨辉三角_牛客题霸_牛客网 (nowcoder.com)

思路: 

  • 可以根据规律当行数为零行时候或者当行数和列数相等的时候为数字1.

然后从行数2列数1开始符合arr[i][j]=arr[i-1][ j ]+arr[i-1][j-1] ;

#include<stdio.h>
int main()
{
    int arr[30][30]={0};
    int n=0;
    scanf("%d",&n);
    int i =0;
    for(i=0;i<n;i++)
    {
        int j=0;
        for(j=0;j<=i;j++)
        {
            if(i==j||j==0)
            {
                arr[i][j]=1;
            }
            if(i>=2&&j>=1)
            {
                arr[i][j]=arr[i-1][j]+arr[i-1][j-1];
            }
            printf("%5d",arr[i][j]);
        }
        printf("\n");
    }
    
    return 0;
}
  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值