• HDU5671Matrix(矩阵行列交换)


    有一个nn行mm列的矩阵(1 leq n leq 1000 ,1 leq m leq 1000 )(1n1000,1m1000),在这个矩阵上进行qq  (1 leq q leq 100,000)(1q100,000) 个操作:
    
    1 x y: 交换矩阵MM的第xx行和第yy行(1 leq x,y leq n)(1x,yn);
    2 x y: 交换矩阵MM的第xx列和第yy列(1 leq x,y leq m)(1x,ym);
    3 x y: 对矩阵MM的第xx行的每一个数加上y(1 leq x leq n,1 leq y leq 10,000)y(1xn,1y10,000);
    4 x y: 对矩阵MM的第xx列的每一个数加上y(1 leq x leq m,1 leq y leq 10,000)y(1xm,1y10,000);
    输入描述
    输入包含多组数据. 第一行有一个整数T (1leq Tleq 15)T(1T15), 表示测试数据的组数. 对于每组数据:
    第一行输入3个整数nn, mm, qq.
    接下来的nn行,每行包括mm个整数,表示矩阵MM。(1 leq M_{i,j} leq 10,000),(1 leq i leq n,1 leq j leq m)(1Mi,j​​10,000),(1in,1jm).
    最后qq行,每行输入三个整数a(1 leq a leq 4)a(1a4), xx, yy。
    
    输出描述
    对于每组数据,输出经过所有qq个操作以后的矩阵MM。
    输入样例
    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
    
    输出样例
    12 13 14 15
    1 2 3 4
    3 4 5 6
    1 10
    10 1

    先设两个数组 x[i],y[j]分别表示 第 i 行此时应该是第x[i]行,而第j列此时是第y[j]列,
    在设两个数组addx[i],addy[j]分别表示 第 i 行加上addx[i], 第j列加上 addy[j]
     1 #include <iostream>
     2 #include <algorithm>
     3 #include <cstring>
     4 #include <cstdio>
     5 using namespace std;
     6 const int Max = 10000 + 10;
     7 int x[Max], y[Max], addx[Max], addy[Max];
     8 int g[Max][Max];
     9 
    10 int main()
    11 {
    12     int t;
    13     int n, m, q;
    14     scanf("%d", &t);
    15     while (t--)
    16     {
    17         scanf("%d%d%d", &n, &m, &q);
    18         for (int i = 1; i <= n; i++)
    19         {
    20             for (int j = 1; j <= m; j++)
    21                 scanf("%d", &g[i][j]);
    22         }
    23         for (int i = 1; i <= n; i++)
    24             x[i] = i;  // 初始化为本身
    25         for (int j = 1; j <= m; j++)
    26             y[j] = j;
    27         memset(addx, 0, sizeof(addx));
    28         memset(addy, 0, sizeof(addy));
    29         while (q--)
    30         {
    31             int op;
    32             int tx ,ty;
    33             scanf("%d%d%d", &op, &tx, &ty);
    34             if (op == 1)
    35             {
    36                 int temp = x[tx];  // 行交换
    37                 x[tx] = x[ty];
    38                 x[ty] = temp;
    39             }
    40             else if (op == 2)
    41             {
    42                 int temp = y[tx];
    43                 y[tx] = y[ty];
    44                 y[ty] = temp;
    45             }
    46             else if (op == 3)
    47             {
    48                 addx[ x[tx] ] += ty;
    49             }
    50             else if (op == 4)
    51             {
    52                 addy[ y[tx] ] += ty;
    53             }
    54         }
    55         for (int i = 1; i <= n; i++)
    56         {
    57             for (int j = 1; j < m; j++)
    58                     printf("%d ", g[ x[i] ][ y[j] ] + addx[ x[i] ] + addy[ y[j] ]);
    59             printf("%d
    ", g[ x[i] ][ y[m] ] + addx[ x[i] ] + addy[ y[m] ]);
    60         }
    61     }
    62     return 0;
    63 }
    View Code
  • 相关阅读:
    一本通 1259:【例9.3】求最长不下降序列
    一本通 1258:【例9.2】数字金字塔
    洛谷 P1198 [JSOI2008]最大数
    洛谷 P2863 [USACO06JAN]牛的舞会The Cow Prom
    【BZOJ1062】糖果雨(NOI2008)-数形结合+二维树状数组
    【BZOJ4070】雅加达的摩天楼(APIO2015)-分块+最短路
    【BZOJ2326】数学作业(HNOI2011)-递推+矩阵快速幂
    【BZOJ2734】集合选数(HNOI2012)-状压DP
    【BZOJ3213】抛硬币(ZJOI2013)-期望DP+KMP+高精度
    【BZOJ3590】Quare(SNOI2013)-状压DP
  • 原文地址:https://www.cnblogs.com/zhaopAC/p/5428086.html
Copyright © 2020-2023  润新知