hdu 5671 Matrix

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

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

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

#include <iostream>
#include <cstdio>
#include <map>
#include <cstring>
#include <vector>
using namespace std;
const int N = 1005;
int n, m;
int row[N];
int col[N];
int mat[N][N];
int row_add[N];
int col_add[N];
int main()
{
    int T, q, type, x, y;
    scanf("%d", &T);
    while(T--)
    {
        scanf("%d%d%d", &n, &m, &q);
        memset(row_add, 0, sizeof(row_add));
        memset(col_add, 0, sizeof(col_add));
        for(int i=0; i<n; i++)
        {
            for(int j=0; j<m; j++)
            {
                scanf("%d", &mat[i][j]);
                col[j] = j;
            }
            row[i] = i;
        }
        while(q--)
        {
            scanf("%d%d%d", &type, &x, &y);
            if(type == 1)
            {
                x--;
                y--;
                swap(row[x], row[y]);
                swap(row_add[x], row_add[y]);
            }
            else if(type == 2)
            {
                x--;
                y--;
                swap(col[x], col[y]);
                swap(col_add[x], col_add[y]);
            }
            else if(type == 3)
            {
                x--;
                row_add[x] += y;
            }
            else if(type == 4)
            {
                x--;
                col_add[x] += y;
            }
        }
        for(int i=0; i<n; i++)
        {
            for(int j=0; j<m ;j++)
                if(j == 0)
                    printf("%d", mat[row[i]][col[j]] + row_add[i] + col_add[j]);
                else
                    printf(" %d", mat[row[i]][col[j]] + row_add[i] + col_add[j]);
            printf("\n");
        }
    }
    return 0;
}


发布了106 篇原创文章 · 获赞 69 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/u014142379/article/details/51278314
今日推荐