一、题目说明
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列。
二、思路
观察题目要求,除了简单的输入输出之外,难点在于如何将矩阵进行旋转
旋转:说白了,其实就是不同行、列数据之间的交换。
那如何进行 行和列 的交换呢?
方法:进行行的交换的时候,要固定住行,进行每一列数据的交换(即将每列的数据,重新分配到交换之后的行号志宏)
进行列的交换,则要固定住列,进行每一行的数据的交换(即将每行的数据,重新分配到不同列之中)
if(ch == 'r') //行
{
for(j = 0; j < m; j++)
{
tmp = arr[a-1][j]; //将行固定为a-1 b-1 ,将每列交换
arr[a-1][j] = arr[b-1][j];
arr[b-1][j] = tmp;
}
}
else if(ch == 'c') //列
{
int ii = 0;
for(ii = 0; ii < n; ii++)
{
tmp = arr[ii][a-1]; //将列固定为a-1 b-1 ,将每行交换
arr[ii][a-1] = arr[ii][b-1];
arr[ii][b-1] = tmp;
}
}
三、代码
#include <stdio.h>
int main() {
int n = 0;
int m = 0;
int i = 0;
int j = 0;
scanf("%d %d",&n,&m); //读值
getchar();
int arr[n][m];
for(i = 0; i < n; i++)
{
for(j = 0; j < m; j++)
{
scanf("%d",&arr[i][j]);
getchar();
}
}
int k = 0;
scanf("%d",&k); //读取k
getchar();
char ch = 0;
int a = 0;
int b = 0;
for(i = 0; i < k; i++) //执行 k 次
{
scanf("%c %d %d",&ch,&a,&b); //需要自己输入行和列
getchar();
int tmp = 0;
if(ch == 'r')
{
for(j = 0; j < m; j++)
{
tmp = arr[a-1][j];
arr[a-1][j] = arr[b-1][j];
arr[b-1][j] = tmp;
}
}
else if(ch == 'c')
{
int ii = 0;
for(ii = 0; ii < n; ii++)
{
tmp = arr[ii][a-1];
arr[ii][a-1] = arr[ii][b-1];
arr[ii][b-1] = tmp;
}
}
}
for(i = 0; i < n; i++)
{
for(j = 0; j < m; j++)
{
printf("%d ",arr[i][j]);
}
putchar(10);
}
return 0;
}
四:总结
1.需要自己输入行和列的时候,使用时,需要将行r - 1 , 列c -1。
2.理不清思路的时候,尝试先用现实的逻辑解决问题,再将语言转换成代码语言。