(来自 牛客网 编程初学者入门训练)
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()则读取标准输入流中第一个非空白字符,屏蔽了空白字符。