题目描述


解题思路

对于输入的状态,找出玩家和箱子的位置,并使用坐标记录其位置,然后对于终端输入的走法,依次判断player按该走法一步一步的移动之后是否能够成功。由于思路比较简单,实际内容就是如何让计算机模拟这个推箱子的过程。步骤也很简单,只有上下左右移动,但是需要注意的是每次移动之前,需要对于题目描述的集中状态和情况进行判断,保证每一种情形都考虑到而且不重复判断。另外还需要注意的一点是,每次移动完成之后,需要对棋盘以及玩家和箱子的位置和状态进行更新,以便于真正模拟了游戏的过程。

实现代码

#include<iostream>#include<string>using namespace std;char chessboard[100][100]; // 棋盘布局char chessboard_bkup[100][100]; // 棋盘布局char path[200][10000]; // 推动路径int path_count[10000];string results[10000]; // 记录每一个玩法的最终胜负状态int main(){int N =0,M = 0,S = 0;cin>>N>>M>>S;int player_m = 0,player_n = 0; // 玩家的坐标int player_m_bkup = 0,player_n_bkup = 0;int box_m = 0,box_n = 0; // 箱子的坐标int box_m_bkup = 0,box_n_bkup = 0;bool flag_1 = true,flag_2 = true;for(int m=0;m<M;m++){ // M行cin>>chessboard_bkup[m];for(int n=0;n<strlen(chessboard_bkup[m]);n++){if(flag_1 == true){if(chessboard_bkup[m][n] == '1'){ // 玩家的位置player_m_bkup = m;player_n_bkup = n;flag_1 = false;}}if(flag_2 == true){if(chessboard_bkup[m][n] == '3'){ // 箱子的位置box_m_bkup = m;box_n_bkup = n;flag_2 = false;}}}}for(int i=0;i<S;i++) // 读取走法需要的步数和具体走法cin>>path_count[i]>>path[i];bool flag = false;for(int i=0;i<S;i++){// 每一次移动之后都需要判断是否已经到了目标位置// 在箱子的每次移动的时候需要判断将要移动的位置是否是目标位置,如果不是,需要对棋盘布局进行修改// 修改的棋盘是输入棋盘的一个副本flag = false;player_m = player_m_bkup;player_n = player_n_bkup;box_m = box_m_bkup;box_n = box_n_bkup;for(int p=0;p<M;p++)for(int q=0;q<N;q++)chessboard[p][q] = chessboard_bkup[p][q];for(int j=0;j<path_count[i];j++){if(path[i][j] == 'u'){ // 上移if(chessboard[player_m-1][player_n] == '3'){ // 移动方向上有箱子if(chessboard[player_m-2][player_n] == '0' || chessboard[player_m-2][player_n] == '2'){ // 移动方向没有被墙壁挡住if(chessboard[player_m-2][player_n] == '2'){chessboard[player_m][player_n] = '0';chessboard[player_m-1][player_n] = '1';player_m-=1;box_m-=1; flag = true;results[i] = "YES";}else{chessboard[player_m][player_n] = '0';chessboard[player_m-1][player_n] = '1';chessboard[player_m-2][player_n] = '3';player_m-=1;box_m-=1; }} // 若被挡住则什么也不做}else{if(chessboard[player_m-1][player_n] == '0' || chessboard[player_m-1][player_n] == '2'){if(chessboard[player_m-1][player_n] == '0'){chessboard[player_m][player_n] = '0';chessboard[player_m-1][player_n] = '1';player_m-=1; // 如果移动方向没有箱子,且没有墙壁阻挡,只移动玩家}else{player_m-=1;}}}}if(path[i][j] == 'd'){ // 下移if(chessboard[player_m+1][player_n] == '3' || chessboard[player_m+2][player_n] == '2'){ if(chessboard[player_m+2][player_n] == '2'){chessboard[player_m][player_n] = '0';chessboard[player_m+1][player_n] = '1';player_m+=1;box_m+=1; flag = true;results[i] = "YES";}else{chessboard[player_m][player_n] = '0';chessboard[player_m+1][player_n] = '1';chessboard[player_m+2][player_n] = '3';player_m+=1;box_m+=1;  } }else{if(chessboard[player_m+1][player_n] == '0' || chessboard[player_m+1][player_n] == '2'){if(chessboard[player_m][player_n+1] == '0'){chessboard[player_m][player_n] = '0';chessboard[player_m+1][player_n] = '1';player_m+=1;}else{player_m+=1;}}}}if(path[i][j] == 'l'){ // 左移if(chessboard[player_m][player_n-1] == '3'){ if(chessboard[player_m][player_n-2] == '0' || chessboard[player_m][player_n-2] == '2'){ if(chessboard[player_m][player_n-2] == '2'){chessboard[player_m][player_n] = '0';chessboard[player_m][player_n-1] = '1';player_n-=1;box_n-=1; flag = true;results[i] = "YES";}else{chessboard[player_m][player_n] = '0';chessboard[player_m][player_n-1] = '1';chessboard[player_m][player_n-2] = '3';player_n-=1;box_n-=1;  } }}else{if(chessboard[player_m][player_n-1] == '0' || chessboard[player_m][player_n-1] == '2'){if(chessboard[player_m][player_n+1] == '0'){chessboard[player_m][player_n] = '0';chessboard[player_m][player_n-1] = '1';player_n-=1;}else{player_n-=1;}}}}if(path[i][j] == 'r'){ // 右移if(chessboard[player_m][player_n+1] == '3'){ if(chessboard[player_m][player_n+2] == '0' || chessboard[player_m][player_n+2] == '2'){ if(chessboard[player_m][player_n+2] == '2'){chessboard[player_m][player_n] = '0';chessboard[player_m][player_n+1] = '1';player_n+=1;box_n+=1; flag = true;results[i] = "YES";}else{chessboard[player_m][player_n] = '0';chessboard[player_m][player_n+1] = '1';chessboard[player_m][player_n+2] = '3';player_n+=1;box_n+=1;  } }}else{if(chessboard[player_m][player_n+1] == '0' || chessboard[player_m][player_n+1] == '2'){if( chessboard[player_m][player_n+1] == '0'){chessboard[player_m][player_n] = '0';chessboard[player_m][player_n+1] = '1';player_n+=1;}else{player_n+=1;}}}}}if(flag == false)results[i] = "NO";}       for(int i=0;i<S;i++){cout<<results[i]<<endl;}return 0;}

测试输出

测试用例和测试结果如下:


箱子在目标点上输出为YES,否则输出为NO

代码中对于状态和棋盘都是使用的备份内容中实现的,由于时间紧迫,当时采用了这种临时的做法,后来看看,没有太多的必要使用一份备份来进行操作。不过对于推箱子的过程以及状态判断和棋盘更新部分的代码思路还是正确的。

网易游戏2016实习生招聘笔试题目--推箱子相关推荐

  1. 网易游戏2016实习生招聘笔试题目--井字棋

    题目描述 解题思路 使用一个3维数组input[][3][3],保存输入的棋局的状态.再使用一个一维数组result[],保存每个棋局的胜负情况,用数字表示胜负.3表示o胜,12表示x胜,0表示棋盘下 ...

  2. 连连看——网易游戏2016实习生招聘

    题目 小江最喜欢玩的游戏"天下3"最近推出了连连看的小玩法.玩家可以将2个相同图案的牌子连接起来,连接线不多于3根线段(即最多拐2折),就可以成功将这对牌子消除.如示意图所示,红色 ...

  3. 微软实习生招聘笔试题目

    微软实习生招聘笔试题目 您好!以下是本次微软实习生招聘的笔试题目,请仔细阅读并认真答题: 注意:本次测试题目仅限本人阅读,请勿传阅他人.谢谢! 提交材料 1.不超过2页的说明书,包括算法,设计,使用说 ...

  4. 2013年阿里巴巴实习生招聘笔试题目及解答

    有幸参加了2013年5月5日阿里巴巴的实习生招聘笔试,这次笔试的难度对我而言,前半部分不涉及算法的内容,都比较容易.而后面3道关于算法的习题都解答得很不好,暴露出来自己的一些问题.本人马上也要毕业了, ...

  5. 【IT企业笔试集】2013年阿里巴巴实习生招聘笔试题目及解答

    有幸参加了2013年5月5日阿里巴巴的实习生招聘笔试,这次笔试的难度对我而言,前半部分不涉及算法的内容,都比较容易.而后面3道关于算法的习题都解答得很不好,暴露出来自己的一些问题.本人马上也要毕业了, ...

  6. 腾讯实习生招聘笔试题目

    2013腾讯实习生笔试题  一. 单项选择题 1) 给定3个int类型的正整数x,y,z,对如下4组表达式判断正确的选项() Int a1=x+y-z; int b1=x*y/z; Int a2=x- ...

  7. 网易游戏2018实习生招聘题目-游戏客户端开发实习生

    题目链接地址:https://www.nowcoder.com/test/10780537/summary 难度系数:三颗星 1. 正确答案 3 3 首先第五行这里的效果是arr[0]变为90,但是p ...

  8. 网易游戏2016校园招聘数据挖掘研究员在线笔试题和答案

    刚做完网易在线笔试题,感触最深的地方是,虽然题目形式和ACM题目相似,但是内容更偏向于实际应用.总共有四个题目,第一个题目属于字符串匹配类型,难度较低,第二个题目是模拟SQL语句的输出,第三个题目是K ...

  9. 阿里实习生招聘笔试题目

    题目: 第一题选C,不解释吧,按位与就行 第二题选D,不解释,2*3*sizeof(int*)=48(64位机器上是8字节一个指针) 第三题选C,我不确定,不过,应该是的 第四题选D,明显考的是补码 ...

最新文章

  1. mysql和mariadb可以同时使用吗,MariaDB与MySQL在一台服务器同时运行
  2. 别在 Java 代码里乱打日志了,这才是正确的日志打印姿势!
  3. Linux网络通信管理
  4. ios uilabel 根据文字 计算宽度 高度
  5. .NET Core使用IO合并技巧轻松实现千万级消息推送
  6. mysql+after+commit_Spring事务aftercommit原理及实践
  7. mybatis学习(4):工具类和实体类的创建
  8. 企业微信如何设置发票抬头 管理员在企业微信设置发票抬头的方法介绍
  9. python 二维码_Python提取支付宝和微信支付二维码
  10. 师妹问我:有哪些新手程序员不知道的小技巧?
  11. 假设检验与区间估计的异同
  12. 编写iPhone应用程序有何不同
  13. jquery 弹出层
  14. MCGS触摸屏通过MODBUS通讯速度控制台达B2伺服参数
  15. Linux下pip安装教程
  16. 终南山--SpringBoot系列之Spring Data Jpa连表查询和分页
  17. 【腾讯云】音视频存储管理CVS
  18. java-简易计算器设计
  19. CSS实现中英双语导航栏——利用块级元素隐藏实现
  20. hdu 50722014鞍山现场赛C题(容斥原理+同色三角形)

热门文章

  1. Angular 运行报错 RouterModule.forRoot() called twice.
  2. css 识别变量中的换行符_跟我一起全面了解一下CSS变量
  3. php 记事本源代码_php实现记事本案例
  4. python协程池操作mysql_在python中使用aiomysql异步操作mysql
  5. 解决Unsupported major.minor version 51.0错误
  6. ViewPager+Fragment实现TabHost(可复用的类)
  7. 理解 Delphi 的类(十) - 深入方法[28] - 递归函数实例: 搜索当前目录下的所有嵌套目录...
  8. 很近没读书了,读书笔记之大道至简
  9. C++文件如何在linux下生成动态库So,以及如何使用这个动态库
  10. Strategy模式与Delegate委托