幻方矩阵

题目描述:

一天蒜头一天蒜头君买了一个幻方矩阵,这个矩阵每次可以交换任意两行或者任意两列。花椰妹君买了一个幻方矩阵,这个矩阵每次可以交换任意两行或者任意两列。花椰妹看到说这么简单的东西,我自己就可以编程实现了。蒜头君要强地说这么简单我肯定会,但其实她不会,所以请你来帮帮他。
在这里插入图片描述

分析:

这个题看数据范围很明显如果暴力的话,绝对会超时而且内存也会超限。
对于内存超限这个问题我们可以用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");
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_43506138/article/details/88178884
今日推荐