题目:
描述
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'时代表进行(xing,这里容易把题读错,不是行列,是进行‘列’)列变换,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
编程思维:
1,首先我们读完题,要把具体的问题抽象到脑海里,然后在去看题目和我们所抽象出来的是否一致,或者缺少哪些条件,最后具体化步骤。
2,抽象该题目:就是要先一个矩阵要给它进行行,列变换。
3,读题目条件:由题可知:输入分三行,分别是:第一行:输入n*m的矩阵,第二行:输入它n*m个元素(赋值到对应行列上),第三行:输入一个值k表示要操作行或者列变换的次数,输入字符r表示行行变换,字符c进行 列 变换,a和b是需要互换的行或者列。
4,具体化步骤:
1,首先要获取一个矩阵,我们要创建一个二维数组(1≤n≤10,1≤m≤10),创建变量n,m,用scanf输入语句进行赋值。确定行和列。
2,用双重循环以n,m为条件进行遍历,赋值。
3,定义变量k,然后用scanf语句确定好要输入的操作次数。
4,设置while循环,条件为k(操作次数),并且每次循环减1,当k为0时循环跳出,
5,循环里用scanf'语句确定字符,行号(列号),行号(列号)的值。循环体里进行,行行或者列列的交换。
6,循环打印这个矩阵。
一下是实现代码:
#include <stdio.h>
int main() {
int n=0,m=0;
int arr[11][11] = { 0 };
scanf("%d %d",&n,&m);
int i = 0;
int j = 0;
//输入n*m个数字
for(i = 0;i<n;i++){
for(j = 0;j<m;j++){
scanf("%d",&arr[i][j]);
}
}
int t = 0; //变化的次数
int a = 0; //输入变化的行号(也或者是列号)
int b = 0; //输入变化的列号(也或者是列号)
int temp =0; //用来交换的杯子
char flag = 'r'; //表示进行 列 变换,r表示行行变换
scanf("%d",&t);
while(t){
scanf(" %c %d %d",&flag,&a,&b); //这里读取%c的时候要注意清空空格,不然会都读成字符
a--;b--;
//行行交换
if(flag == 'r'){
for(j = 0;j<n;j++){
temp = arr[a][j];
arr[a][j] = arr[b][j];
arr[b][j] = temp;
}
}
//列列交换
if(flag == 'c'){
for(i = 0;i<m;i++){
temp = arr[i][a];
arr[i][a] = arr[i][b];
arr[i][b] = temp;
}
}
t--;
}
//打印数组
for(i = 0;i<n;i++){
for(j = 0;j<m;j++){
printf("%d ",arr[i][j]);
}
printf("\n");
}
return 0;
}
注意事项:
1,要清空缓冲区:在scanf括号里面”最前面打个空格。
2,a和b要--,因为我们输入的行号或者列号是从1开始的,计算机数组是从0开始读取的。