每日刷题计划-1-28

122 阅读2分钟

「这是我参与2022首次更文挑战的第9天,活动详情查看:2022首次更文挑战」 BC108 矩阵交换、## 描述

KiKi有一个矩阵,他想知道经过k次行变换或列变换后得到的矩阵。请编程帮他解答。

输入描述:

第一行包含两个整数n和m,表示一个矩阵包含n行m列,用空格分隔。 (1≤n≤10,1≤m≤10)

从2到n+1行,每行输入m个整数(范围-231~231-1),用空格分隔,共输入n*m个数,表示第一个矩阵中的元素。

接下来一行输入k,表示要执行k次操作(1≤k≤5)。接下来有k行,每行包括一个字符t和两个数a和b,中间用空格格分隔,t代表需要执行的操作,当t为字符'r'时代表进行行变换,当t为字符'c'时代表进行列变换,a和b为需要互换的行或列(1≤a≤b≤n≤10,1≤a≤b≤m≤10)。

提示:当t为别的字符时不需要处理

输出描述:

输出n行m列,为矩阵交换后的结果。每个数后面有一个空格。

示例1

输入:

2 2
1 2
3 4
1
r 1 2

复制

输出:

3 4 
1 2 

复制

示例2

输入:

2 2
1 3
6 8
2
c 1 2
t 1 2

复制

输出:

3 1 
8 6 

复制

说明:

当t为别的字符时不需要处理,所以只交换了原矩阵的第1列和第2列。 
#include<stdio.h>
int main()
{
    int n = 0;
    int m = 0;
    //输入n,m的值
    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]);
        }
    }
    //输入k的数据
    int k = 0;
    scanf("%d",&k);
    char t = 0;
    int a = 0;
    int b = 0;
    //共执行K次操作
    for(i = 0; i < k; i++)
    {
        scanf(" %c %d %d",&t,&a,&b);    //%c前面加空格的原因是:消耗%d后的空白字符
        if(t == 'r')
        {
            //行变化,交换a和b行
            //行交换时,上下交换,列不变,行改变
            //有多少列就交换多少次,所以m为循环变量
            for(j = 0; j < m; j++)
            {
                int tmp = arr[a-1][j];    //看示例得知,交换是认为第一列下标为1
                //而二维数组的下标从0开始 所以要是arr[a-1] [b-1]
                arr[a-1][j] = arr[b-1][j];
                arr[b-1][j] = tmp;
            }
        }
        else if(t == 'c')
        {
            //列变换,交换第b列和第a列
            //左右变换,行不变,列改变,有多少行就交换多少次,所以n为循环变量
            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;
}