BC108 矩阵交换

本文介绍了如何通过编程解决一个矩阵变换的问题。给定一个矩阵和一系列行或列交换的操作,程序需要根据指令完成矩阵的变换并输出最终结果。题目中提供了详细的输入输出描述、解题思路以及C语言的实现代码,特别注意输入字符时需要处理空格,并且在交换行或列时要正确处理边界条件。
摘要由CSDN通过智能技术生成

(来自 牛客网 编程初学者入门训练)

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()则读取标准输入流中第一个非空白字符,屏蔽了空白字符

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

'Dream是普通小孩耶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值