(来自 牛客网 编程初学者入门训练)
1.问题:
(链接呈上:矩阵交换)
描述
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)。
输出描述:
输出n行m列,为矩阵交换后的结果。每个数后面有一个空格。
示例1
输入:
2 2 1 2 3 4 1 r 1 2输出:
3 4 1 2
2.思路:
首先根据输入描述分别输入相关的内容 但是要注意再输入操作次数后需要用for循环来输入相应的操作!! 每一次操作后都要执行相应的操作(交换行或者列 若输入错误则不进行交换)--这意味着在for循环下同时进行输入与操作 然后输出应该也是在该循环中 因为操作在该循环中 变化也是在该循环中 而输出条件为进行完最后一次的操作
3.代码:
#include<stdio.h> int main() { int n = 0; int m = 0; int k = 0; char t = 0; int a = 0; int b = 0; int ret = 0; int num[10][10] = { 0 }; //printf("请分别输入n行m列:"); scanf("%d %d", &n, &m); if ((n >= 1) && (n <= 10) && (m >= 1) && (m <= 10)) { //printf("请输%d行%d列数:\n", n, m); int i = 0; int j = 0; for (i = 1; i <= n; i++) { for (j = 1; j <= m; j++) { scanf("%d", &num[i][j]); } } //printf("请输入操作次数k:"); scanf("%d", &k); if ((k >= 1) && (k <= 5)) { //printf("请输入操作:\n"); int p = 0; for (p = 0; p < k; p++) { scanf(" %c %d %d", &t, &a, &b);//%c前多输入一个空格 -非空格的正式字符! if ('r' == t)//行变换 { //if ((a >= 1) && (a <= n) && (b >= 1) && (b <= m)) //错误 行列会被限制 此时的限制条件应该由行列变换决定!! if ((a >= 1) && (a <= n)) { //int l = 0;//多余条件 会使变化归零 //for (l = 0; l < k; l++) //{ for (j = 1; j <= m; j++) { ret = num[a][j]; num[a][j] = num[b][j]; num[b][j] = ret; } //} } } else if ('c' == t)//列变换 { //if ((a >= 1) && (a <= n) && (b >= 1) && (b <= m)) if((b >= 1) && (b <= m)) { //int l = 0; //for (l = 0; l < k; l++) //{ for (i = 1; i <= n; i++) { ret = num[i][a]; num[i][a] = num[i][b]; num[i][b] = ret; } //} } } //限制太多 只要有正确的就运行正确的 //else //{ //printf("输入错误!\n"); //break; //} if (p == (k - 1)) { //printf("结果为:\n"); for (i = 1; i <= n; i++) { for (j = 1; j <= m; j++) { printf("%d ", num[i][j]); } printf("\n"); } } } } } return 0; }
4.注意点:
严格注意代码中的标注内容:输入字符时前面加空格 在进行行或者列的变化时 输入的a b应该是受限于所变化的行或列 而不是同时满足!
5.补充点:
关于%d输入字符:
对于scanf()而言,%c是个较为特殊的说明符。 %c前没空格,scanf()将读取标准输入流中的第一个字符,%c前有空格,scanf()则读取标准输入流中第一个非空白字符,屏蔽了空白字符。