hud5671;模拟题;
http://acm.hdu.edu.cn/showproblem.php?pid=5671;
题目大意;输入一个矩阵的行列和要执行操作的步数;
有四种操作;
1 x y;就是把x,y行进行交换;
2 x y;就是把x,y列进行交换;
3 x y;就是把x行的所有元素都加y;
4 x y;就是把x列的所有元素都加y;
应该是道很水的模拟题;但是一提交直接超时;搞了大半天才知道不能用常规方法做 ;
竟然用空间换时间的方法;
直接贴代码;
#include<stdio.h>
int s[1005][1005],h[1005],l[1005];
//h表示行的交换,l表示列的交换;
int main()
{
int t, t1,i, j, k, n, m,q,x,y,o;
scanf("%d",&t1);
while(t1--)
{
//printf("hhuii\n");
int x1[1005]={0},x2[1005]={0};//控制元素加减的;x1表示每行的加减,x2表示每列的加减
scanf("%d %d %d",&n,&m, &q);
for(i = 1; i <= n; i++)
for(j = 1; j <= m; j++)
scanf("%d",&s[i][j]);
for(i = 1; i <= n; i++)//对应的行的下标
h[i] = i;
for(i = 1; i <= m; i++)
l[i] = i;
while(q--)
{
scanf("%d %d %d",&k,&x,&y);
if(k == 1)
{
t = h[x];
h[x] = h[y];
h[y] = t;
}
if(k == 2)
{
t = l[x];
l[x] = l[y];
l[y] = t;
}
if(k == 3)
{
x1[h[x]] += y;
}
if(k == 4)
{
x2[l[x]] += y;
}
}
for(i = 1; i <= n; i++)
{
for(j = 1; j < m; j++)
{
printf("%d ",s[h[i]][l[j]]+x1[h[i]]+x2[l[j]]);
}
printf("%d",s[h[i]][l[m]]+x1[h[i]]+x2[l[m]]);
printf("\n");
}
}
return 0 ;
}
特别注意这题很容易超时的;输出的时候如果加if来判断输出空格那也会超时的;