题意分析:

(1)题目是模拟开心消消乐的游戏逻辑,当交换两个相邻的图片时,如果交换后的面板中有连续的三个以上的相同的图片(拍成行或列),那么这些排列成行或列的相同的图形将消失,上面的图形将下落填充中间的空白,下落后有可能再次出现可消除的情况,于是同以上步骤,一直到最后没有可消除为止,求这次交换操作一共可消去多少个图形。

(2)题目对游戏的原型进行了简化:即消去一部分图形之后,没有新的图形产生,下落完成后,空余的部分用空白替代,图形用字符代替。我们可以先从第一个非‘.’的字符出发,作如下操作:从这个字符开始左右扫描,找出这一行是否有连续的三个以上(包括本字符)字符和本字符相同,设这一可消行的左右边界为(b,d);如没有连续的三个及以上,则从这个字符上下开始扫描。如找到可消列,设列的边界为(a,c)

(3)注意:这里并非找到连续的三个及以上相同的字符就立即消除,而是要顺着这个可消行(列)依次向上下(左右)继续搜索,找出在这个行(列)上其他的字符为中心上下扩展搜索的可消除列(行)的字符,称为"枢轴",见下图:

(4)如图:找到可消区域的枢轴之后,沿着枢轴找到上下边界(a,c),左右边界(b,d),然后删除这个边界内的图形;图一是正确的消除,反之,如果一开始找到连续的三个及以上的图形就删除,就会导致图二的错误,会由于消除枢轴之后,右边一列下落之后缺少一个,不能消除。

(5)设枢轴为arr[x][y],按照(4)消除之后,就需要将在x行以上(a,c)列之间的列向下移动一个位置,y列中空格上面的字符集体向下移动(d-1-b)个位置

(6)消除并移动之后,就会出现新的面板状态,这时有可能新的面板状态中由于图形的移动会出现新的可消行(列),于是我们又需要从头开始检索,如果存在可消行(列),就执行以上的重复步骤;反之,就开始检索下一个位置。这就是典型的回溯

可能坑点:

(1)没有找到枢轴,只找到可消行列就开始消除

(2)一定要注意可消行列的边界,本算法中边界不包括a、c、b、d,很容易不注意就弄错边界

(3)回溯的条件是:这一轮没有找到可消的行列,反应在数字上就是连续行、列相同的图形个数分别小于3,注意一定要是分别小于3!!!这里很容易出错。

(4)消除的时候下落距离要弄清

#include <iostream>
#include <stdio.h>using namespace std;int N,M;
char arr[20][20];
int res=0;
void cal()
{for(int i=0;i<N;i++){for(int j=0;j<M;j++){//遇到非空格字符的时候才开始判断if(arr[i][j]!='.'){int x=i,y=j;//最终消除区域的中心int a=i,b=j,c=i,d=j;int sum=0;int temp=0;//先开始纵向搜索while((--a)>=0&&arr[a][j]==arr[i][j])temp++;while((++c)<N&&arr[c][j]==arr[i][j])temp++;//若纵向搜索可找到消除的列if(temp>=2){sum+=temp;temp=0;int maxum=0;//开始在这个纵向列上以每个字符为中心开始横向搜索for(int k=a+1;k<=c;k++){int cnt=0;int b1=j,d1=j;while((--b1)>=0&&arr[k][b1]==arr[i][j])cnt++;while((++d1)<M&&arr[k][d1]==arr[i][j])cnt++;//若横向搜索可找到消除的行if(cnt>=2&&cnt>maxum){maxum=cnt;//更新中心点x=k;y=j;//更新左右边界b=b1;d=d1;}}sum+=maxum;}else//若纵向搜索找不到消除的列{temp=0;a=i,b=j,c=i,d=j;//开始重新横向搜索while((--b)>=0&&arr[i][b]==arr[i][j])temp++;while((++d)<M&&arr[i][d]==arr[i][j])temp++;//若横向搜索可找到消除的行if(temp>=2){sum+=temp;temp=0;int maxum=0;//开始在这个横向行上以每个字符为中心开始纵向搜索for(int k=b+1;k<d;k++){int cnt=0;int a1=i,c1=i;while((--a1)>=0&&arr[a1][k]==arr[i][j])cnt++;while((++c1)<N&&arr[c1][k]==arr[i][j])cnt++;//若纵向搜索可找到消除的列if(cnt>=2&&cnt>maxum){maxum=cnt;//更新中心点x=i;y=k;//更新上下边界a=a1;c=c1;}}sum+=maxum;}}//若符合消除的条件if(sum>=2){res+=sum;sum=0;res++;//若纵向上有消除的列,则消除后合并if(c-a>=3){for(int e=a;e>=0;e--)arr[e+c-1-a][y]=arr[e][y];for(int e=0;e<c-a-1;e++)arr[e][y]='.';}//若横向上有消除的行,则消除后合并if(d-b>=4){for(int e=b+1;e<d;e++){for(int f=x-1;f>=0;f--)arr[f+1][e]=arr[f][e];arr[0][e]='.';}}//开始向下回溯cal();}}}}
}
int main()
{int S,x0,y0,x1,y1;cin>>S;while(S--){cin>>N>>M;for(int i=0;i<N;i++){for(int j=0;j<M;j++)cin>>arr[i][j];}scanf("%d %d %d %d",&x0,&y0,&x1,&y1);char temp=arr[x0][y0];arr[x0][y0]=arr[x1][y1];arr[x1][y1]=temp;cal();printf("%d\n",res);res=0;}return 0;
}

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

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

    题意分析: (1)给出一个N*M矩阵用来表示灰度图像,矩阵中的每一个数的范围在[0,255]之间,定义7种对矩阵的操作:1.顺时针旋转90度,2.逆时针旋转90度,3.上下翻转180度,4.左右翻转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. 标准功能模块组件 -- 内部联络单组件,内部邮件组件,提高多人异地协同办公效率...
  2. 命令行客户端MySQL基本命令的使用(登录、登出、数据库操作的SQL语句、表结构的SQL语句、表数据操作的SQL语句)
  3. Repository 设计模式介绍
  4. jsp动作之 getProperty
  5. 【ASP.NET Core】处理异常(下篇)
  6. centos系统安全设置
  7. 初学FPGA一些建议
  8. 《高质量程序设计指南--C/C++语言》学习笔记
  9. 面试时说上一家公司的离职原因
  10. android 工程模式mtk,Android L版本上user版本工程模式中gsensor校准失败
  11. H5移动端前置摄像头成像方向错误,横屏方向错误
  12. ubuntu18.04 安装flash。
  13. 水果超市配送小程序的功能
  14. vscode使用remote--ssh进行远程连接报错Resolver error: Error: Connecting with SSH timed out
  15. 【DBC】DBC文件格式详解
  16. Oracle EBS Interface/API(35) -创建供应商地点API
  17. [C++]小根堆 插入/删除/初始化
  18. clip python_Python pandas.DataFrame.clip函数方法的使用
  19. 如何规划自己的职业生涯
  20. RPG游戏《黑暗之光》流程介绍与代码分析之(十四):角色技能系统的实现

热门文章

  1. Xilinx HLS 导出IP失败的最新解决方案(2022.1.15)
  2. 怎么用计算机求平均值,电脑教程:计算机平均值怎么求
  3. 百度云不限速for mac
  4. VS 2010错误提醒: 必需属性“VSInstallDir”缺失或为空 以及 error MSB8008
  5. IMU选型、标定误差分析、AHRS组合导航
  6. 子库存-OU-库存组织-关系
  7. 今日头条面试——iOS开发岗
  8. 人工智能技术助力民族语言保护大有可为
  9. 这个是没事的时候做出来看的一系列算数表
  10. luogu 1757 分组背包