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

描述

推箱子是一款经典游戏。如图所示,灰色格子代表不能通过区域,蓝色方格是箱子,黑色圆形代表玩家,含有圆点的格子代表目标点。

规定以下规则:

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

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 : 推箱子 (网易游戏笔试题)的更多相关文章

  1. 【面试笔试算法】Program 2:Amusing Digits(网易游戏笔试题)

    时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 网易成立于1997年6月,是中国领先的互联网技术公司.其相继推出了门户网站.在线游戏.电子邮箱.在线教育.电子商务等多种服 ...

  2. 【面试笔试算法】Program 3 : Complicated Expression(网易游戏笔试题)

    时间限制:50000ms 单点时限:5000ms 内存限制:256MB 描述 在lisp语言中,表达式都用前缀法表示,例如,1 + 2 在lisp中使用(+ 1 2)来表示,其中,表达式的括号是必需的 ...

  3. 【面试笔试算法】Program 4 : Best Compression Algorithms(网易游戏笔试题)

    时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 易信是由网易和电信联合开发的一款即时通讯软件.除了语音聊天,免费电话等新功能以外,传统的文字信息聊天功能也得以保留,因此每 ...

  4. 用C#制作推箱子小游戏

    思路分析: 一.制作一个地图 二.地图中放置墙.箱子.人.目标等 三.让小人动起来完成推箱子动作 游戏制作: 1.按照上述地图制作一个地图  (12行×13列) 地图可以看做是行和列组成的,即可以看做 ...

  5. c++、c实现推箱子小游戏

    经过四次的修改和优化,终于将推箱子这个游戏完整的写出来了,今天就像大家分享一下这个游戏的编写. 这个游戏界面的编写总的来说不困难,主要是推动箱子的算法. (1)利用数组和windows api 即可写 ...

  6. 完整版本的推箱子小游戏,最简单的纯C语言打造

    /* 推箱子小游戏 1.定义绘制样式 用二维数组的方式 2.绘制图像 3.找出当前位置 4.逻辑判断,制造动作 根据数学xy轴的规律,这里使用ij 上移,行轴上升,行数减少 下移,行数下降,函数增加 ...

  7. C++ 控制台推箱子小游戏

              // 游戏菜单.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #in ...

  8. 推箱子小游戏《格鲁的实验室》13关 - bfs最短路径

    下载了一款推箱子小游戏,第13关的时候怎么也破不了最佳纪录(最少步数是9而我们最好的方案是10步),因为数据比较小(6*8的方阵),所以写了个BFS来找最短路. 游戏的目标是把小黄人推到黄色球,小绿人 ...

  9. C/C++编程笔记:C语言写推箱子小游戏,大一学习C语言练手项目

    C语言,作为大多数人的第一门编程语言,重要性不言而喻,很多编程习惯,逻辑方式在此时就已经形成了.这个是我在大一学习 C语言 后写的推箱子小游戏,自己的逻辑能力得到了提升,在这里同大家分享这个推箱子小游 ...

随机推荐

  1. Docker学习笔记2: Docker 概述

    一.什么是Docker Docker是基于Go语言实现的云开源项目. Docker 的主要目标是:"Bulid,Ship and  Run Any App ,AnyWhere" , ...

  2. java记事本开发

    今天我想要分享的是一个用java写的一个记事本程序.我知道现在市面上有各种各样的记事本了,但是我发现有的写的功能不够完善,或者是代码层次结构不够清晰,有的甚至看了之后云里雾里的,有的还不乏了非常明显的 ...

  3. Matlab 2015b 启动时崩溃 MATLAB crashes during startup on Ubuntu 16.04

    Matlab 启动时崩溃 MATLAB crashes during startup on Ubuntu Matlab 2015B Ubuntu 16.04 之前解决过,更新后问题又来了.     出 ...

  4. vbs注册表增删改

    vbs注册表增删改非常简单.过去竟然能忍受那么多次手动在注册表编辑器操作...应该认真反思自己的懒惰了. Dim op Set op=WScript.CreateObject("WScrip ...

  5. HTTP状态码总结

    HTTP状态码(HTTP Status Code)是用以表示网页服务器HTTP响应状态的3位数字代码.有些 App 端接口与 HTML 接口用的是同一个,所以做移动端开发也有必要了解一下HTTP状态码 ...

  6. Shell脚本生成网页版相册浏览器

    今天学到了一招,那就是使用脚本制作一款网页版相册浏览器.先上图吧. 必备基础 操作系统: 以linux为内核的操作系统都行 编程语言:Shell(bash)脚本,相关基础知识即可 下载工具:wget ...

  7. UE4 读取本地图片

    参考链接:https://answers.unrealengine.com/questions/235086/texture-2d-shows-wrong-colors-from-jpeg-on-ht ...

  8. Sharing The Application Tier File System in Oracle E-Business Suite Release 12.2

    The most current version of this document can be obtained in My Oracle Support Knowledge Document 13 ...

  9. Android透明动画

    Android透明动画 核心方法 public void startAnimation(Animation animation) 执行动画,参数可以是各种动画的对象,Animation的多态,也可以是 ...

  10. C++对C的实用性增强

    #include <iostream> using namespace std; //C语言中的变量都必须在作用域开始的位置定义!! //C++中更强调语言的"实用性" ...