hdoj5671 【交换行、列】

本文详细介绍了如何使用简单的算法操作矩阵,包括交换行、列以及对行、列加数的方法,并提供了复杂度分析。通过实例演示了如何通过索引找到原始矩阵中的值并进行调整。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对于交换行、交换列的操作,分别记录当前状态下每一行、每一列是原始数组的哪一行、哪一列即可。

对每一行、每一列加一个数的操作,也可以两个数组分别记录。注意当交换行、列的同时,也要交换增量数组。

输出时通过索引找到原矩阵中的值,再加上行、列的增量。

复杂度O(q+mn)

#include<cstdio>
#include<iostream>
#include<vector>
#include<set>
#include<map>
#include<queue>
#include<math.h>
#include<queue>
#include<stdlib.h>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
using namespace std;
#define INF 0x3f3f3f3f
#define N 1010
int a[N][N];
int ans[N][N];

int xh[N],h[N];
int xl[N],l[N];

int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int q,n,m;
        scanf("%d%d%d",&n,&m,&q);
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
                scanf("%d",&a[i][j]);
        }
        memset(xh,0,sizeof(xh));
        memset(xl,0,sizeof(xl));
        for(int i=1;i<=n;i++)
            h[i]=i;
        for(int i=1;i<=m;i++)
            l[i]=i;
        int k,x,y;
        for(int i=0;i<q;i++)
        {
            scanf("%d%d%d",&k,&x,&y);
            if(k==1)
            {
                int t=h[x];
                h[x]=h[y];
                h[y]=t;
            }
            else if(k==2)
            {
                int t=l[x];
                l[x]=l[y];
                l[y]=t;
            }
            else if(k==3)
            {
                xh[h[x]]+=y;
            }
            else if(k==4)
            {
                xl[l[x]]+=y;
            }
        }
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                ans[i][j]=a[h[i]][l[j]]+xh[h[i]]+xl[l[j]];
            }
        }
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                if(j!=1)
                    printf(" ");
                printf("%d",ans[i][j]);
            }
            printf("\n");
        }
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值