题意分析:

(1)给出一个N*M矩阵用来表示灰度图像,矩阵中的每一个数的范围在[0,255]之间,定义7种对矩阵的操作:1.顺时针旋转90度,2.逆时针旋转90度,3.上下翻转180度,4。左右翻转180度,5.给矩阵中的某个子矩阵(定义(x0,y0)为子矩阵的左上角,(x1,y1)为子矩阵的右下角)中的每个数加上一个特定的值val,6.同操作5,给子矩阵中的每个数减去val,7.截取矩阵中的某个子矩阵(定义(x0,y0)为子矩阵的左上角,(x1,y1)为子矩阵的右下角),求给定一组连续的操作后,最终的矩阵的形态如何,输出矩阵的行数、列数、左上角的值、矩阵中所有元素的和

(2)由于是连续的几组操作,所以在某次操作之后,矩阵的形态可能会发生改变,由于不方便直接对原始操作,我们采用另一个矩阵arr2[][]来保存初始矩阵arr1[][]操作之后的结果,然后再将arr2[][]复制给arr1[][],作为下一次操作的初始矩阵,根据题意我们知道:操作1、2、7会改变初始矩阵的形态,操作3、4、5、6不会改变矩阵的形态,由于3、4直接在初始矩阵上操作会有点麻烦,为了统一,我们把3、4和1、2、7归为一类,这类操作使用arr2[][]作为操作结果,5、6则不需要;

(3)顺时针旋转的时候,矩阵变为M*N的,我们在纸上可以模拟出同一个元素坐标的对应关系:假设旋转之后arr2[][]的某一个元素为arr2[i][j],表示这个元素在旋转后的矩阵中的位置是第i行,第j列,在把这个矩阵逆时针复原的时候,我们可以发现,现在的列变成的原来的行(第一列是原来的最后一行),所以arr2[i][j]在arr2中是第j列,在arr1中是第N-1-j行;同时现在的行变成原来的列(第一行就是原来的第一列),所以arr2[i][j]在arr2中是第i行,在arr1中是第i列,即arr2[i][j]=arr1[N-1-i][i];同理我们可以模拟出逆时针旋转后元素对应关系:arr2[i][j]=arr1[j][M-1-i],上下翻转和左右翻转比较直观,上下翻转的对应关系:arr2[i][j]=arr1[N-1-i][j],左右翻转的对应关系:arr2[i][j]=arr1[i][M-1-j],5、6、7的操作比较简单,直接在arr1上x0<=x<=x1,y0<=y<=y1操作即可.

(4)注意每次对改变矩阵形态操作一定要重新调整N(行)、M(列)的值,且操作完后用arr2更新arr1

(5)考虑到数据量的原因,尽量使用scanf和printf输入输出

可能坑点:

(1)对矩阵的旋转操作没有找对元素的对应关系

(2)对改变矩阵形态的操作结束之后,没有更新N、M

(3)没有用arr2更新arr1

#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;int N,M;
int arr1[100][100];
int arr2[100][100];
int x0,y0,x1,y1,val;void operate(int op)
{if(op==1){for(int i=0;i<M;i++){for(int j=0;j<N;j++)arr2[i][j]=arr1[N-1-j][i];}int temp=N;N=M;M=temp;memcpy(arr1,arr2,sizeof(arr2));}else if(op==2){for(int i=0;i<M;i++){for(int j=0;j<N;j++)arr2[i][j]=arr1[j][M-1-i];}int temp=N;N=M;M=temp;memcpy(arr1,arr2,sizeof(arr2));}else if(op==3){for(int i=0;i<N;i++){for(int j=0;j<M;j++)arr2[i][j]=arr1[N-1-i][j];}memcpy(arr1,arr2,sizeof(arr2));}else if(op==4){for(int i=0;i<N;i++){for(int j=0;j<M;j++)arr2[i][j]=arr1[i][M-1-j];}memcpy(arr1,arr2,sizeof(arr2));}else if(op==5){for(int i=x0;i<=x1;i++){for(int j=y0;j<=y1;j++){arr1[i][j]+=val;if(arr1[i][j]>=255)arr1[i][j]=255;}}}else if(op==6){for(int i=x0;i<=x1;i++){for(int j=y0;j<=y1;j++){arr1[i][j]-=val;if(arr1[i][j]<=0)arr1[i][j]=0;}}}else{for(int i=x0;i<=x1;i++){for(int j=y0;j<=y1;j++){arr2[i-x0][j-y0]=arr1[i][j];}}N=x1-x0+1;M=y1-y0+1;memcpy(arr1,arr2,sizeof(arr2));}
}int main()
{int S,T,op;scanf("%d",&S);while(S--){scanf("%d %d",&N,&M);memset(arr1,-1,sizeof(arr1));memset(arr2,-1,sizeof(arr2));for(int i=0;i<N;i++){for(int j=0;j<M;j++){scanf("%d",&arr1[i][j]);}}scanf("%d",&T);while(T--){scanf("%d",&op);if(op<5)operate(op);else if(op<7){scanf("%d %d %d %d %d",&x0,&y0,&x1,&y1,&val);operate(op);}else{scanf("%d %d %d %d",&x0,&y0,&x1,&y1);operate(op);}}int sum=0;for(int i=0;i<N;i++){for(int j=0;j<M;j++){sum+=arr1[i][j];}}printf("%d %d %d %d\n",N,M,arr1[0][0],sum);}return 0;
}

网易互娱2017实习生招聘游戏研发工程师在线笔试第二场(图像处理)相关推荐

  1. 网易互娱2017实习生招聘游戏研发工程师在线笔试第二场(一起消消毒)

    题意分析: (1)题目是模拟开心消消乐的游戏逻辑,当交换两个相邻的图片时,如果交换后的面板中有连续的三个以上的相同的图片(拍成行或列),那么这些排列成行或列的相同的图形将消失,上面的图形将下落填充中间 ...

  2. 网易互娱2017实习生招聘游戏研发工程师在线笔试第二场(神奇的数)

    题意分析: (1)数论的题目,给出一个long long类型的范围[N,M],求出这个范围中满足三个条件的数的个数: ①这个数至少包含('2', '3', '5')中的任意一个数字; ② 这个数不能出 ...

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

    偶尔碰到这题,简单数位DP题,然而我已生疏了-- 这次算是重新想到的,看来对DP的理解有增进了-- dp[i][j][k],表示前i为,mod为j,是否出现2.3.5的剩下的数位可组成的数字.答案就是 ...

  4. 网易互娱2017实习生招聘在线笔试(二)

    题目2 : 源代码编译 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在网易游戏的日常工作中,C++ 是一门常用的语言.面对众多的 C++ 代码,等待源文件编译的漫长时 ...

  5. 网易互娱2017实习生招聘在线笔试第一场-2源代码编译

    http://hihocoder.com/contest/ntest2016spring1/problem/2 拓扑排序 处理一下字符串 没什么好说的.. 时间限制:10000ms 单点时限:1000 ...

  6. 网易互娱2017实习生招聘在线笔试--源代码编译

    描述 在网易游戏的日常工作中,C++ 是一门常用的语言.面对众多的 C++ 代码,等待源文件编译的漫长时间是个令人糟心的时刻,一直以来大家对此怨声载道.终于有一天,大家找到了你,一位优秀的程序员,请你 ...

  7. 网易互娱2017实习生招聘在线笔试(三)

    题目3 : 画线 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小王最近在开发一种新的游戏引擎,但是最近遇到了性能瓶颈.于是他打算从最基本的画线功能开始分析优化.画线其 ...

  8. 网易互娱2017实习生招聘在线笔试第一场-3划线

    时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描写叙述 小王近期在开发一种新的游戏引擎,可是近期遇到了性能瓶颈.于是他打算从最主要的画线功能開始分析优化. 画线事实上就是调用 ...

  9. 网易互娱2017实习生招聘在线笔试第一场-题目3

    题目3 : 画线 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小王最近在开发一种新的游戏引擎,但是最近遇到了性能瓶颈.于是他打算从最基本的画线功能开始分析优化.画线其 ...

最新文章

  1. Linux下安装php环境并且配置Nginx支持php-fpm模块
  2. python 去除字符串里所有标点符号
  3. Java内存管理和客户加载过程_Java内存管理的进一步理解-模拟过程图解
  4. 在生产环境中调试 Angular 应用程序而不显示源映射
  5. java api限流_Java 9:流API的增强
  6. Linux 命令行输入
  7. 【华为云技术分享】云容器引擎 CCE权限管理实践
  8. HTML动态时间代码
  9. ireport 怎么使用in查询
  10. 为什么使用 adapter模式
  11. 《软件需求十步走》阅读计划第三篇
  12. 正态分布的前世今生(下)
  13. 微信小程序开发之——模板
  14. kali linux mysql密码,Kali Linux中MySQL重置root密码
  15. 基于Unique ID的单片机程序加密系统 单片机唯一ID程序加密
  16. PSPNet 使用问题
  17. 信息系统安全思维导图
  18. vue下拉el-select三级联动(公司-部门-人员)
  19. s3c6410 开发板Linux系统支持 K9GAG08U0E的方法(第二篇)
  20. firebug lite for chrome

热门文章

  1. 免费开源好用还佛系的国产PDF软件:pdf补丁丁下载 | 含pdf补丁丁使用手册
  2. c语言getch常见错误,getch()出错
  3. cesium分屏对比
  4. 乘风破浪程序猿,拒绝原地踏步!
  5. C++程序设计图书信息管理系统(页面)
  6. Oracle 的next_day函数详解
  7. 数组转这种格式 county_list:{ 110101: “东城区“, 110102: “西城区“, 110105: “朝阳区“, 110106: “丰台区“,
  8. 使用链表进行奇偶分排 c语言
  9. 网络及网络设备(持续更新)
  10. 使用ScanShadowsFilter过滤激光雷达拖尾