【面试笔试算法】Program 5 : 推箱子 (网易游戏笔试题)
描述
推箱子是一款经典游戏。如图所示,灰色格子代表不能通过区域,蓝色方格是箱子,黑色圆形代表玩家,含有圆点的格子代表目标点。
规定以下规则:
1、一局游戏中只会有一个箱子,一个玩家和一个目标点。
2、通过方向键控制玩家移动。
3、图中的灰色格子代表墙壁,玩家与箱子都不能通过。
4、推到墙壁的箱子,就无法再将箱子推离墙壁,因为玩家无法到达箱子靠墙壁的一侧去推箱子。也就是说箱子只能以“被推”的方式被移动,不是以“被拉”的方式被移动。但如果玩家将箱子推至墙壁后,垂直墙壁的两侧没有阻碍物,则玩家可以朝这两个不同的方向推移箱子。如果箱子进入角落,就没有办法再推动这个箱子了。
5、玩家是不能走出场景的。玩家推着箱子到达场景边缘,如果继续点击使玩家和箱子向墙壁前进的方向键,箱子和人都会保持不动。玩家的前进方向上如果有墙壁,也是不能前进的。但是这些点击都视为合理的输入。
6、箱子一旦到达目标点,就不能再移动了。但这时,玩家仍然可以在场景内自由行动。如果继续尝试推箱子,那么玩家将会和箱子一起保持在原地不动。
现在,给出一种方向键的点击方案,请判断,这种方案是否能使箱子最终停在目标点上。为了方便表示,我们以0代表空白格子,以4代表不能通过区域,以1代表玩家,以3代表箱子,以2代表目标点。
输入
第一行数据包含三个整数,N,M,S。其中,N(0 < N <= 100)代表格子的宽度,M(0 < M <= 100)代表格子的高度,S(0 < S <= 200)代表测试点的个数。
接下来的M行,每行都会有N个字符,描述当前的盘面。
接下来的S行,每行都代表一个测试点。每行都以一个整数T(0 < T <= 10000)开头,接下来是一个空格和T个字符。这T个字符仅由d,u,l,r这四个字母组成,分别代表了敲击向下,向上,向左,向右的方向键。
输出
对于每个测试点,输出最后箱子是否在目标点上。如果是,输出YES,如果不是,则输出NO。
5 4 3 00000 13000 00200 00000 4 rurd 6 urdldr 6 rrrurd
YES
NO
#include "stdafx.h" #include <string> #include <stdio.h> #include <iostream> using namespace std; char Board[ 100][100 ]; // 棋盘 char Boardbak[100][100 ]; int main() { int n, m , s; string temp (100, '0'); int player_x = 0 , player_y = 0; int player_x_bak = 0 , player_y_bak = 0; bool havaPlayer = false ; cin >> n >> m >> s; for (int x = 0; x < m; ++x) { cin >> temp; for ( int y = 0 ; y < n; ++y ) { if (! havaPlayer && temp [y] == '1') { player_x_bak = x; player_y_bak = y; havaPlayer = true ; } Boardbak [x][ y] = temp [y]; } } while (s--) { bool isSuccess = false; int count = 0; string path (10000, '0'); cin >> count >> path; //初始化棋盘 for ( int i = 0 ; i < m; ++i ) { for ( int j = 0 ; j < n; ++j ) { Board [i][ j] = Boardbak [i][ j]; } } //初始化玩家位置 player_x = player_x_bak; player_y = player_y_bak; for ( int z = 0 ; z < count;++z ) { if ( path[z ] == 'd' )//向下 { if ( player_x + 2 < m) // 判断下面没有越界 { if (! isSuccess && Board [player_x + 1][ player_y] == '3')// 判断下面有箱子 { if ( Board[player_x + 2 ][player_y] == '0')// 判断箱子下面是空格 { //更新棋盘 Board [player_x][player_y] = '0' ; Board [player_x + 1][ player_y] = '1' ; Board [player_x + 2][ player_y] = '3' ; //更新玩家位置 player_x = player_x + 1; } else if (Board[player_x + 2 ][player_y] == '2') //箱子下面是目标点 { isSuccess = true ; } } else // 判断没有箱子,就只有玩家动 { if ( Board[player_x + 1 ][player_y] == '0')// 玩家下面是空格 { //更新棋盘 Board [player_x][player_y] = '0' ; Board [player_x + 1][ player_y] = '1' ; //更新玩家位置 player_x = player_x + 1; } } } else { if ( Board[player_x + 1 ][player_y] == '0') //下面越界,玩家下面是空格 { //更新棋盘 Board [player_x][player_y] = '0' ; Board [player_x + 1][ player_y] = '1' ; //更新玩家位置 player_x = player_x + 1; } } } else if (path[z ] == 'u' )//向上 { if ( player_x - 2 >=0) // 判断上面没有越界 { if (! isSuccess && Board [player_x - 1][ player_y] == '3')// 判断上面有箱子 { if ( Board[player_x - 2 ][player_y] == '0')// 判断箱子上面是空格 { //更新棋盘 Board [player_x][player_y] = '0' ; Board [player_x - 1][ player_y] = '1' ; Board [player_x - 2][ player_y] = '3' ; //更新玩家位置 player_x = player_x - 1; } else if (Board[player_x - 2 ][player_y] == '2') //箱子上面是目标点 { isSuccess = true ; } } else // 判断没有箱子,就只有玩家动 { if ( Board[player_x - 1 ][player_y] == '0')// 玩家上面空格 { //更新棋盘 Board [player_x][player_y] = '0' ; Board [player_x - 1][ player_y] = '1' ; //更新玩家位置 player_x = player_x - 1; } } } else { if ( Board[player_x - 1 ][player_y] == '0') //上面越界,玩家上面是空格 { //更新棋盘 Board [player_x][player_y] = '0' ; Board [player_x - 1][ player_y] = '1' ; //更新玩家位置 player_x = player_x - 1; } } } else if (path[z ] == 'l' )//左 { if ( player_y - 2 >= 0 ) // 判断左边没有越界 { if (! isSuccess && Board [player_x][player_y -1 ] == '3')// 判断左边有箱子 { if ( Board[player_x ][player_y - 2] == '0') //判断箱子左边是空格 { //更新棋盘 Board [player_x][player_y] = '0' ; Board [player_x][player_y - 1] = '1' ; Board [player_x][player_y - 2] = '3' ; //更新玩家位置 player_y = player_y - 1; } else if (Board[player_x ][player_y - 2] == '2') //箱子左边是目标点 { isSuccess = true ; } } else // 判断没有箱子,就只有玩家动 { if ( Board[player_x ][player_y - 1] == '0') //玩家左边是空格 { //更新棋盘 Board [player_x][player_y] = '0' ; Board [player_x][player_y -1 ] = '1' ; //更新玩家位置 player_y = player_y - 1; } } } else { if ( Board[player_x ][player_y - 1] == '0') //左边越界,玩家左边是空格 { //更新棋盘 Board [player_x][player_y] = '0' ; Board [player_x][player_y - 1] = '1' ; //更新玩家位置 player_y = player_y - 1; } } } else if (path[z ] == 'r' )//向右 { if ( player_y + 2 < n) // 判断右边没有越界 { if (! isSuccess && Board [player_x][player_y + 1] == '3')// 判断右边有箱子 { if ( Board[player_x ][player_y + 2] == '0') //判断箱子右边是空格 { //更新棋盘 Board [player_x][player_y] = '0' ; Board [player_x][player_y + 1] = '1' ; Board [player_x][player_y + 2] = '3' ; //更新玩家位置 player_y = player_y + 1; } else if (Board[player_x ][player_y + 2] == '2') //箱子右边是目标点 { isSuccess = true ; } } else // 判断没有箱子,就只有玩家动 { if ( Board[player_x ][player_y + 1] == '0') //玩家右边是空格 { //更新棋盘 Board [player_x][player_y] = '0' ; Board [player_x][player_y + 1] = '1' ; //更新玩家位置 player_y = player_y + 1; } } } else { if ( Board[player_x ][player_y + 1] == '0') //右边越界,玩家右边是空格 { //更新棋盘 Board [player_x][player_y] = '0' ; Board [player_x][player_y + 1] = '1' ; //更新玩家位置 player_y = player_y + 1; } } } } if ( isSuccess) { cout << "YES" << endl; } else cout << "NO" << endl; } return 0; }
【面试笔试算法】Program 5 : 推箱子 (网易游戏笔试题)的更多相关文章
- 【面试笔试算法】Program 2:Amusing Digits(网易游戏笔试题)
时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 网易成立于1997年6月,是中国领先的互联网技术公司.其相继推出了门户网站.在线游戏.电子邮箱.在线教育.电子商务等多种服 ...
- 【面试笔试算法】Program 3 : Complicated Expression(网易游戏笔试题)
时间限制:50000ms 单点时限:5000ms 内存限制:256MB 描述 在lisp语言中,表达式都用前缀法表示,例如,1 + 2 在lisp中使用(+ 1 2)来表示,其中,表达式的括号是必需的 ...
- 【面试笔试算法】Program 4 : Best Compression Algorithms(网易游戏笔试题)
时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 易信是由网易和电信联合开发的一款即时通讯软件.除了语音聊天,免费电话等新功能以外,传统的文字信息聊天功能也得以保留,因此每 ...
- 用C#制作推箱子小游戏
思路分析: 一.制作一个地图 二.地图中放置墙.箱子.人.目标等 三.让小人动起来完成推箱子动作 游戏制作: 1.按照上述地图制作一个地图 (12行×13列) 地图可以看做是行和列组成的,即可以看做 ...
- c++、c实现推箱子小游戏
经过四次的修改和优化,终于将推箱子这个游戏完整的写出来了,今天就像大家分享一下这个游戏的编写. 这个游戏界面的编写总的来说不困难,主要是推动箱子的算法. (1)利用数组和windows api 即可写 ...
- 完整版本的推箱子小游戏,最简单的纯C语言打造
/* 推箱子小游戏 1.定义绘制样式 用二维数组的方式 2.绘制图像 3.找出当前位置 4.逻辑判断,制造动作 根据数学xy轴的规律,这里使用ij 上移,行轴上升,行数减少 下移,行数下降,函数增加 ...
- C++ 控制台推箱子小游戏
// 游戏菜单.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #in ...
- 推箱子小游戏《格鲁的实验室》13关 - bfs最短路径
下载了一款推箱子小游戏,第13关的时候怎么也破不了最佳纪录(最少步数是9而我们最好的方案是10步),因为数据比较小(6*8的方阵),所以写了个BFS来找最短路. 游戏的目标是把小黄人推到黄色球,小绿人 ...
- C/C++编程笔记:C语言写推箱子小游戏,大一学习C语言练手项目
C语言,作为大多数人的第一门编程语言,重要性不言而喻,很多编程习惯,逻辑方式在此时就已经形成了.这个是我在大一学习 C语言 后写的推箱子小游戏,自己的逻辑能力得到了提升,在这里同大家分享这个推箱子小游 ...
随机推荐
- Weblogic 12c 集群环境搭建
本文是在windows7操作系统下配置的,jdk版本1.7 ,weblogic版本12.1.3.0.0. 搭建集群前的规划 其中AdminServer是总控制端,server1.server2.ser ...
- Web自动化框架LazyUI使用手册(4)--控件抓取工具Elements Extractor详解(批量抓取)
概述 前面的一篇博文详细介绍了单个控件抓取的设计思路&逻辑以及使用方法,本文将详述批量控件抓取功能. 批量抓取:打开一个web页面,遍历页面上所有能被抓取的元素,获得每个元素的iframe.和 ...
- 20 ViewPager Demo3指示器
MainActivity.java package com.qf.day20_viewpager_demo3; import java.util.ArrayList; import java.util ...
- VS2008界面语言设置
在卸载某个软件的时候,不知道什么原因导致vs2008的界面变成中文的了,但是菜单还是英文的,很不美观. 几经查找,最后可以在如下的地方设置界面语言 Tools -> Options 如果设置成 ...
- 一步步创建Qt Widget项目+TextFinder案例(摘自笔者2015年将出的《QT5权威指南》,本文为试读篇)
创建一个基于应用的QtWidget应用程序 这个手册描述了怎样使用QtCreater创建个一个小的Qt应用程序,Text Finder.它是Qt工具Text Finder例子的简写版本.这个应用 ...
- Android面试之高级篇
结合自己之前去很多大公司的面试经历和自己面别人的一些题,这里做一些总结,Android面试中常见的面试题. 1,Android的Handler运行机制 要解释Handler的运行机制就要讲几个对象:M ...
- Java-IO之ByteArrayOutputStream
ByteArrayOutputSTream是字节数组输出流,继承于OutputStream.ByteArrayOutputStream中的数据被写入到一个byte数组中,缓冲区会随着数据的不断写入而自 ...
- java虚拟机构造原理
Java虚拟机的生命周期 一个运行中的Java虚拟机有着一个清晰的任务:执行Java程序.程序开始执行时他才运行,程序结束时他就停止.你在同一台机器上运行三个程序,就会有三个运行中的Java虚拟机. ...
- java造成内存泄露原因
一.Java内存回收机制 不论哪种语言的内存分配方式,都需要返回所分配内存的真实地址,也就是返回一个指针到内存块的首地址.Java中对象是采用new或者反射的方法创建的,这些对象的创建都是在堆(He ...
- UI设计——最后一根稻草
WindowsLive提供的本地地图服务看起来挺简单的,但其实非常难用: 跟其他人一样,每当我接触到一个新的地图服务,我做的第一件事总是拿当前的地址去试一试.我在上面输入的是我工作的地方.但是,当我敲 ...