• HDU 5671 Matrix


    Matrix

    Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)
    Total Submission(s): 502    Accepted Submission(s): 215

    Problem Description
    There is a matrix that has n rows and m columns (1n1000,1m1000).Then we perform q(1q100,000) operations:
    1 x y: Swap row x and row y (1x,yn) ;
    2 x y: Swap column x and column y (1x,ym) ;
    3 x y: Add y to all elements in row x (1xn,1y10,000) ;
    4 x y: Add y to all elements in column x (1xm,1y10,000) ;
     
    Input
    There are multiple test cases. The first line of input contains an integer T(1T20) 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.(1M,i,j10,000) for all (1in,1jm) .
    The following q lines contains three integers a(1a4) , 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
    Hint
    Recommand to use scanf and printf
     
    Recommend
    wange2014   
    题目大意:有一个n行m列的矩阵,在这个矩阵上进行q个操作,输出经过所有q个操作以后的矩阵M
    思路:用4个数组,对于交换行、交换列的操作,分别记录当前状态下每一行、每一列是原始数组的哪一行、哪一列即可。
    对每一行、每一列加一个数的操作,也可以两个数组分别记录。
    注意当交换行、列的同时,也要交换增量数组。
    输出时通过索引找到原矩阵中的值,再加上行、列的增量。
    #include <iostream>
    #include <string.h> 
    using namespace std;
    int h[1010],l[1010], zh[1010], zl[1010];
    int a[1010][1010];
    int main()
    {
        int T, n, m, q, i, j, c, x, y, t;
        cin>>T;
        while(T--)
        {
        memset(zh,0,sizeof(zh));
        memset(zl,0,sizeof(zl));
        for(i=1;i<=1005;i++)
        h[i]=l[i]=i;
        scanf("%d%d%d", &n, &m, &q);
        for(i=1;i<=n;i++)
            for(j=1;j<=m;j++)
        scanf("%d", &a[i][j]);
        while(q--)
        {
        scanf("%d%d%d", &c, &x, &y);
        if(c==1) {t=h[x];h[x]=h[y];h[y]=t;}
        else if(c==2) {t=l[x];l[x]=l[y];l[y]=t;}
        else if(c==3) zh[h[x]] += y;
        else if(c==4) zl[l[x]] += y;
        }
        for(i=1;i<=n;i++)
            {
            for(j=1;j<=m;j++)
            if(j==1)
            printf("%d", a[h[i]][l[j]]+zh[h[i]]+zl[l[j]]);
            else
            printf(" %d", a[h[i]][l[j]]+zh[h[i]]+zl[l[j]]);
            printf("
    ");
            }
        }
        return 0;
    }
     
  • 相关阅读:
    循环移位算法
    关于Java中2.0-1.1!=0.9的问题
    Java基础语法(三)
    Java基础语法(二)
    Java基础语法(一)
    关于Java运行机制
    Java从零开始(前篇)
    关于.ssh目录下的known_hosts文件的补充
    解决 bash cd too many arguments 报错
    Markdown学习笔记(一)
  • 原文地址:https://www.cnblogs.com/Noevon/p/5426009.html
Copyright © 2020-2023  润新知