时间限制: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. 【mybatis深度历险系列】深入浅出mybatis中原始dao的开发和mapper代理开发

    使用Mybatis开发Dao,通常有两个方法,即原始Dao开发方法和Mapper接口开发方法.mybatis在进行dao开发的时候,涉及到三姐妹,分别是SqlSessionFactoryBuilder ...

  2. gradle 入门介绍

    gradle 简介 基于Groovy实现的自动化构建工具,比maven好的一点在于不用写复杂的xml文件.使用script就可以. gradle 专业名词 从一个build.gradle 文件开始,b ...

  3. 在java程序中实现发送邮件的功能

    最近比较忙,在做一个人事管理系统的项目,在这项目需求中,需要一个发送邮件的功能.这个时候我们可以使用javamail的jar包来实现完美需要的功能,在这里简单的分享一个最基础的发邮件功能. 首先我们需 ...

  4. 手把手教你做一个Shell命令窗口

    这是一个类似于win下面的cmd打开后的窗口,可以跨平台使用,可以在win和linux下面同时使用,主要功能如下: 首先我们需要把这些功能的目录写出来,通过写一个死循环,让其每次回车之后都可以保持同样 ...

  5. Android app内存管理的16点建议

    转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiopshared memory(共享内存) Android通过下面几个方式在不同的Process中来共享RAM: 每一个app的proc ...

  6. CoreText精彩文字轮廓绘制动画的一点改进

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 原文在: http://oleb.net/blog/2010/ ...

  7. Hadoop介绍

    是适合大数据的分布式存储与计算平台,用java编写的开源系统,能够安排在大规模的计算机平台上,从而长进计算效率:由 HDFS.MapReduce.HBase.Hive 和 ZooKeeper等成员组成 ...

  8. 在Gazebo中使用DEM構建起伏地形環境

    所需資料下載地址: 1. https://bitbucket.org/osrf/gazebo_tutorials/raw/default/dem/files/ 数字高程模型(致謝谷歌翻譯)概述数字高程 ...

  9. scala模式匹配的使用

    Scala模式匹配 Tip1:模式总是从上往下匹配,如果匹配不到则匹配case_项(类似Java中的default) Tip2:与Java和C语言不同,不需要在每个分支末尾使用break语句退出(不会 ...

  10. 最近邻查找算法kd-tree

    http://blog.csdn.net/pipisorry/article/details/52186307 )选择特征(坐标轴)的方法  (2)以该特征的哪一个为界 (3)达到什么条件算法结束. ...