hdu 5671 Matrixf

Problem Description

There is a matrix M that has n rows and m columns (1≤n≤1000,1≤m≤1000).Then we perform q(1≤q≤100,000) operations:

1 x y: Swap row x and row y (1≤x,y≤n);

2 x y: Swap column x and column y (1≤x,y≤m);

3 x y: Add y to all elements in row x (1≤x≤n,1≤y≤10,000);

4 x y: Add y to all elements in column x (1≤x≤m,1≤y≤10,000);

Input

There are multiple test cases. The first line of input contains an integer T(1≤T≤20) indicating the number of test cases. For each test case:

The first line contains three integers n, m and q.
The following n lines describe the matrix M.(1≤Mi,j≤10,000) for all (1≤i≤n,1≤j≤m).
The following q lines contains three integers a(1≤a≤4), x and y.

Output

For each test case, output the matrix M after all q operations.

Sample Input

2
3 4 2
1 2 3 4
2 3 4 5
3 4 5 6
1 1 2
3 1 10
2 2 2
1 10
10 1
1 1 2
2 1 2

Sample Output

12 13 14 15
1 2 3 4
3 4 5 6
1 10

10 1

 记忆模拟:行的交换不会影响列的元素(只是影响顺序),列也是。所以只要记忆行和列模拟运行就行。

#include <iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define siz 1005
using namespace std;
int n,m,q;
__int64 a[siz][siz],row[siz],col[siz],j_row[siz],j_col[siz];
int main()
{
    int T,k,x,y,t,adi,adj;
    cin>>T;
    while(T--)
    {
        scanf("%d %d %d",&n,&m,&q);
        for(int i=1;i<=n;i++) row[i]=i;
        for(int i=1;i<=m;i++) col[i]=i;
        memset(j_row,0,sizeof(j_row));
        memset(j_col,0,sizeof(j_col));
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++)
                scanf("%I64d",&a[i][j]);
        }
        for(int i=1;i<=q;i++){
            scanf("%d %d %d",&k,&x,&y);
            if(k==1){
                t=row[x], row[x]=row[y], row[y]=t;
            }
            if(k==2){
                t=col[x], col[x]=col[y], col[y]=t;
            }
            if(k==3){
                t=row[x], j_row[t]+=y;
            }
            if(k==4){
                t=col[x], j_col[t]+=y;
            }
        }
        for(int i=1;i<=n;i++){
            adi=row[i];
            for(int j=1;j<=m;j++){
                adj=col[j];
                if(j==1){
                   cout<<a[adi][adj]+j_row[adi]+j_col[adj];
                }else
                cout<<" "<<a[adi][adj]+j_row[adi]+j_col[adj];
            }
            cout<<endl;
        }
    }
    return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值