交换矩阵行列[不用交换元素]-交换行列的输出编号

题目描述:
给定一个n*m的矩阵,要求支持下面的操作:
0 x y:交换第x行与第y行
1 x y:交换第x列与第y列

题目连接

INPUT:
多组数据。对于每组测试数据,第一行包含三个数n,m,k(1<=n,m<=1000;1<=k<=100000),分别表示行数,列数,操作数。
接下来n行,每行m个整数,表示初始的矩阵,矩阵中每个数小于10^9。
接下来k行每行一个操作,格式如题目所述。

OUTPUT:
对于每组数据,输出完成所有操作后的矩阵。

示例:
输入:
3 2 2
1 2
3 4
5 6
0 1 3
1 1 2
输出:
6 5
4 3
2 1

提示:
输出的每一行后面没有空格。

思路:
首先想到的是输入一组操作就交换数组两行或列的元素,后来果不其然,时间超限。然后仔细想想,交换行列代表什么,不就是把输出的顺序给颠倒了嘛,输出顺序又是什么,不就是数组行列的编号的顺序嘛。所以,我们只要对每一组操作数交换其行列的编号就可以啦。为了不引起混乱,我们重新分配两个数组分别表示行列编号的顺序。下面上代码:

#include<bits/stdc++.h>
using namespace std;

int a[1005][1005];	//矩阵 m x n
int r[1005];    //用来储存行编号的顺序 
int c[1005];	//用来储存列编号的顺序 
int i,j,m,n,k,flag,x,y,t;

int main()
{
	while(scanf("%d %d %d",&m,&n,&k) != EOF)
	{
		for(i=1;i<=m;i++)
		{
			for(j=1;j<=n;j++) scanf("%d",&a[i][j]);
		}
		
		for(i=1;i<=m;i++) r[i]=i;	//初始化行编号 
		for(i=1;i<=n;i++) c[i]=i;	//初始化列编号 
		
		while(k--)
		{
			scanf("%d %d %d",&flag,&x,&y);
			if(flag) //deal with column
			{
				t=c[x]; c[x]=c[y]; c[y]=t;
			}
			else //deal with row
			{
				t=r[x]; r[x]=r[y]; r[y]=t;	
			}
		}
		
		//print
		for(i=1;i<=m;i++)
		{
			for(j=1;j<=n;j++)
			{
				if(j==n) printf("%d\n",a[r[i]][c[j]]); 	//每当到每一行的末尾 不输出空格并且换行 
				else
				{
					printf("%d ",a[r[i]][c[j]]);
				}
			}
		}
	}
	return 0;
}

个人感悟:
学习就是不断意识到自己以前错了的过程。就像小学学到的东西大学也许就变成错的了,暴力刚开始接触编程时是对的,随着学习深入就是错误的了。我们应当坦然,因为这是一种进步,错了不要紧,不要继续错下去就对了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值