HDU 5671 Matrix

来源:互联网 发布:淘宝面单打印软件 编辑:程序博客网 时间:2024/05/18 02:30

这题直接用枚举是要TLE的,关键步骤

是要用4个数组来存下变化的行数,列数,行数增加的数与列数

增加的数,最后输出是就通过这个4个数组作导索来输出数据

还有一点就是交换行,列数 数组时要记得交换行,列增加数 数组

时间复杂度为:O(q+m*n)

代码如下:

#include <algorithm>  #include <iostream>  #include <cstdlib>  #include <cstring>  #include <string>#include <cstdio>  #include <climits>#include <cmath> using namespace std;int data[1005][1005];int exha[1005],exli[1005];int hajia[1005],lijia[1005];int main(){#ifdef DID    freopen("in.txt","r",stdin);    //freopen("out.txt","w",stdout);#endif    int t;    scanf("%d",&t);    while(t--){        memset(data,0,sizeof(data));memset(exha,0,sizeof(exha));memset(exli,0,sizeof(exli));memset(hajia,0,sizeof(hajia));memset(lijia,0,sizeof(lijia));        int n,m,q,num,x,y;        scanf("%d%d%d",&n,&m,&q);        for(int i=0;i<n;i++){exha[i]=i;            for(int j=0;j<m;j++)                scanf("%d",&data[i][j]);} for(int j=0;j<m;j++) exli[j]=j;        for(int i=0;i<q;i++){            scanf("%d%d%d",&num,&x,&y);            if(num==1){                                                  swap(exha[x-1],exha[y-1]);         //记录交换的行数swap(hajia[x-1],hajia[y-1]);       //交换行增加数的数组}            else if(num==2){                    swap(exli[x-1],exli[y-1]);         //与上同理swap(lijia[x-1],lijia[y-1]);}            else if(num==3)                hajia[x-1]+=y;            else                lijia[x-1]+=y;        }        for(int i=0;i<n;i++)            for(int j=0;j<m;j++){               int x1=exha[i],y1=exli[j];            //x1为对应原数组的行,y1对应原数组的列   int addha=hajia[i],addli=lijia[j];    //对应行,列增加数   int num=data[x1][y1]+addha+addli;     //输出数据   if(j!=m-1)       printf("%d ",num);   else   printf("%d\n",num);            }    }  return 0;}




1 0