题目描述:
一天蒜头一天蒜头君买了一个幻方矩阵,这个矩阵每次可以交换任意两行或者任意两列。花椰妹君买了一个幻方矩阵,这个矩阵每次可以交换任意两行或者任意两列。花椰妹看到说这么简单的东西,我自己就可以编程实现了。蒜头君要强地说这么简单我肯定会,但其实她不会,所以请你来帮帮他。
分析:
这个题看数据范围很明显如果暴力的话,绝对会超时而且内存也会超限。
对于内存超限这个问题我们可以用vector来解决。超时的话,我们可以换种思考方案就可以解决了。
我们定义一个Mapping和Colum数组,来保存对应的行列。如Mapping[1]=6;就表示新的矩阵的第一行是原来矩阵的第六行。列同理。
#include"stdio.h"
#include"string.h"
#include"vector"
#include"algorithm"
using namespace std;
typedef long long ll;
vector<ll> a[100001];
int main()
{
ll n,m;
ll op;
while(~scanf("%lld%lld",&n,&m))
{
ll Mapping[100001];
ll Column[100001];
for(ll i=1; i<=n; i++)
{
Mapping[i]=i;
for(ll j=1; j<=m; j++)
{
Column[j]=j;
ll b;
scanf("%lld",&b);
a[i].push_back(b);
}
}
scanf("%lld",&op);
for(ll i=1; i<=op; i++)
{
ll x,y,z;
scanf("%lld%lld%lld",&x,&y,&z);
if(x==0)
{
ll t=Mapping[y];
Mapping[y]=Mapping[z];
Mapping[z]=t;
}
else
{
ll t=Column[y];
Column[y]=Column[z];
Column[z]=t;
}
}
for(ll i=1; i<=n; i++)
{
ll j;
for(j=1; j<m; j++)
{
ll row=Mapping[i];
ll col=Column[j]-1;
printf("%lld ",a[row][col]);
}
ll row=Mapping[i];
ll col=Column[j]-1;
printf("%lld",a[row][col]);
printf("\n");
}
}
}