图像处理

时间限制:10000ms
单点时限:1000ms
内存限制:256MB

描述

灰度图像是每个像素只有一个采样颜色的图像。灰度图像与黑白图像不同,它在黑色与白色之间还有许多级的颜色深度。灰度图像的每个像素通常用8 bits的非线性尺度来保存,这样可以有256种灰度(8bits就是2的8次方=256)。每个像素的范围为[0...255]。

每个灰度图像可以用一个矩阵表示,每个矩阵元素对应灰度图像的灰度值,如下图所示。

示意图

 

图像处理中,包含了各种各样的操作,其中,我们定义了以下的7种操作:

操作类型1:顺时针旋转90度。

操作类型1示意图

操作类型2:逆时针旋转90度。

操作类型2示意图

操作类型3:垂直旋转。

操作类型3示意图

操作类型4:水平旋转。

操作类型4示意图

操作类型5:区域灰度值增加。区域内的所有像素增加指定的灰度值。如果增加后像素值大于255,则保持为255。

操作类型5示意图

操作类型6:区域灰度值减少。区域内的所有像素减少指定的灰度值。如果减少后像素值小于0,则保持为0。

操作类型6示意图

操作类型7:区域裁剪。

操作类型7示意图

 

给出图像对应的初始矩阵以及包含多个操作的序列。我们想知道当所有操作完成后,最后的矩阵的是怎么样的。

输入

每个输入数据包含多个测试点。

输入数据的第一行为S(S <= 10),表示测试数据有S个测试点。

测试点的第一行为N, M (1 <= N, M <= 100),表示矩阵的大小。之后N行,每行包含M个数字,表示对应的像素值,数字的范围在[0...255]。

之后一行是数T(1 <= T <= 50)。之后T行,每行表示一个操作。每行的第一个数表示操作类型。

其中,对于操作类型5和6,该行还会包括5个数x0, y0, x1, y1, value(0 < value <= 255)。分别表示区域左上角(x0, y0)以及区域右下角(x1, y1),该区域中所有像素值增加/减少value。对于操作类型7,该行还会包括4个数x0, y0, x1, y1,表示裁剪的区域左上角(x0, y0)和区域右下角(x1, y1)。

保证所有操作均合法,操作中指定的区域一定是矩阵中的合法区域。保证最后的矩形一定非空。

输出

对应每个测试点输出一行,包括四个数字,分别表示最后矩阵的大小,左上角(0, 0)的像素大小,以及所有像素值的总和。

样例输入
2
3 4
1 2 3 4
5 6 7 8
9 0 1 2
3
1
7 1 0 3 1
5 1 0 1 1 5
2 2
7 8 
7 2
1
1
样例输出
3 2 0 34
2 2 7 24

网易互娱2017实习生招聘游戏研发工程师在线笔试第二场

  1 # include <stdio.h>
  2 # include <string.h>
  3 
  4 int main()
  5 {
  6     int s;
  7     scanf("%d",&s);
  8     while(s--){
  9         int Array[110][110],temp[110][110],n,m,index = 0;
 10         int t,sum = 0,i,j,ans;
 11         memset(Array,0,sizeof(Array));
 12         memset(temp,0,sizeof(temp));
 13         scanf("%d %d",&n,&m);
 14         for(i = 0;i < n;i++)
 15             for(j = 0;j< m;j++){
 16                 scanf("%d",&Array[i][j]);
 17                 sum += Array[i][j];
 18             }
 19 
 20         scanf("%d",&t);
 21         while(t--){
 22             int flag,x0,y0,x1,y1,val;
 23             scanf("%d",&flag);
 24             if(flag == 1){
 25                 index = index ? 0:1;
 26                 for(i = 0;i < n;i++)
 27                 for(j = 0;j < m;j++){
 28                     if(index)   temp[j][n - i -1] = Array[i][j];
 29 
 30                     else    Array[j][n-i-1] = temp[i][j];
 31                 }
 32                 if(index)   ans = temp[0][0];
 33                 else    ans = Array[0][0];
 34                 n = m + n;  m = n - m;  n = n - m;
 35             }
 36             if(flag == 2){
 37                 index = index ? 0:1;
 38                 for(i = 0;i < n;i++)
 39                 for(j = 0;j < m;j++){
 40                     if(index)   temp[m - 1- j][i] = Array[i][j];
 41                     else     Array[m-1-j][i] = temp[i][j];
 42                 }
 43                 if(index)   ans = temp[0][0];
 44                 else    ans = Array[0][0];
 45                 n = m + n;  m = n - m;  n = n - m;
 46             }
 47             if(flag == 3){
 48                 index = index ? 0:1;
 49                 for(i = 0;i < n;i++)
 50                 for(j = 0;j < m;j++){
 51                     if(index){
 52                         temp[n - 1 - i][j] = Array[i][j];
 53                     }
 54                     else     Array[n-1-i][j] = temp[i][j];
 55                 }
 56                 if(index)   ans = temp[0][0];
 57                 else    ans = Array[0][0];
 58             }
 59 
 60             if(flag == 4){
 61                 index = index ? 0:1;
 62                 for(i = 0;i < n;i++)
 63                 for(j = 0;j < m;j++){
 64                     if(index){
 65                         temp[i][m - 1- j] = Array[i][j];
 66                     }
 67                     else     Array[i][m - 1- j] = temp[i][j];
 68                 }
 69                 if(index)   ans = temp[0][0];
 70                 else    ans = Array[0][0];
 71             }
 72 
 73             if(flag == 5 || flag == 6){
 74                 scanf("%d %d %d %d %d",&x0,&y0,&x1,&y1,&val);
 75                 if(flag == 6)   val *= -1;
 76                 sum += val * (x1-x0+1)*(y1-y0+1);
 77                 if(index){
 78                     for(i = x0;i <= x1;i++)
 79                         for(j = y0;j <= y1;j++){
 80                             int x = temp[i][j] + val;
 81                             if(x < 0){
 82                                 sum -= x;
 83                                 x = 0;
 84                             }
 85                             if(x > 255){
 86                                 sum = sum - (x-255);
 87                                 x = 255;
 88                             }
 89                             temp[i][j] = x;
 90                         }
 91                 }
 92                 else{
 93                     for(i = x0;i <= x1;i++)
 94                         for(j = y0;j <= y1;j++){
 95                             int x = Array[i][j] + val;
 96                             if(x < 0){
 97                                 sum -= x;
 98                                 x = 0;
 99                             }
100                             if(x > 255){
101                                 sum = sum - (x-255);
102                                 x = 255;
103                             }
104                             Array[i][j] = x;
105                         }
106                 }
107                 if(index)   ans = temp[0][0];
108                 else    ans = Array[0][0];
109             }
110             if(flag == 7){
111                 scanf("%d %d %d %d",&x0,&y0,&x1,&y1);
112                 m = y1 - y0 + 1;n = x1 - x0 + 1;sum = 0;
113                 index = index ? 0:1;
114                 if(!index){
115                     memset(Array,0,sizeof(Array));
116                     for(i = x0;i <= x1;i++){
117                         for(j = y0;j <= y1;j++){
118                             Array[i-x0][j-y0] = temp[i][j];
119                             sum += temp[i][j];
120                         }
121                     }
122                 }
123                 else{
124                     memset(temp,0,sizeof(temp));
125                     for(i = x0;i <= x1;i++){
126                         for(j = y0;j <= y1;j++){
127                             temp[i-x0][j-y0] = Array[i][j];
128                             sum += Array[i][j];
129                         }
130                     }
131                 }
132                 if(index)   ans = temp[0][0];
133                 else    ans = Array[0][0];
134             }
135         }
136         printf("%d %d %d %d\n",n,m,ans,sum);
137     }
138     return 0;
139 }
模拟过程

 

posted @ 2016-04-25 22:23  1002liu  阅读(230)  评论(0编辑  收藏  举报