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