题意:
      讲的是一个游戏,就是在一个平面上滚动一个1*1*2的长方体的游戏,在本题里面的游戏规则是这样的:
(1)
     一开始给你箱子的状态,可能是横着也可能是竖着。
(2)
     每一次可以滚动箱子,但是每次滚动到的位置(1个或者2个)都必须不能是空的。
(3)
     有的位置只能经得起箱子一半的重量,有的能经得起真个箱子的重量,经得起一半的格子意思就是不能在当前的这个格子上吧箱子竖起来。
(4)然后问从起始状态到掉到终点给的洞里面的最小步数,掉到洞里面的时候必须是竖直掉下去的。

思路:
      比较明显可以用搜索来做,但是这个题目的关键点是如何标记状态,我的做法是对于每一个点都有五个状态,就是另一个点相对于这个点的位置,可以是东南西北,还有正上方
,标记的时候是这样的依靠五个状态,搜索的时候为了简化代码我写的是3个状态的,因为有一些等效状态,我们只要搜索其中的一个就行了,但是如果你愿意把所有的状态都写出来,那么一共是5种,每种有四个方向的走法一共是5*4种选择,这样代码量估计比较大,如果是相等状态只进一个的话可以达到3*4种选择,但是这样的话要注意就是在mark的时候的一些细节,别的没啥的就是简单广搜,姿势好点应该没啥大问题,具体细节可以看下面代码。

#include<queue>
#include<stdio.h>
#include<string.h>

using namespace std;

typedef struct
{
    int x ,y ,t ,k;
}NODE;

NODE xin ,tou;
int map[505][505] ,n ,m;
int mark[505][505][5];
int ex ,ey;

bool ok(int x ,int y ,int k)
{
    return x >= 1 && x <= n && y >= 1 && y <= m && map[x][y] && !mark[x][y][k];
}

int BFS()
{
    queue<NODE>q;
    q.push(xin);
    memset(mark ,0 ,sizeof(mark));
    mark[xin.x][xin.y][xin.k] = 1;
    NODE X1 ,X2;
    while(!q.empty())
    {
        tou = q.front();
        q.pop();
        //printf("%d %d %d %d**\n" ,tou.x ,tou.y ,tou.k ,tou.t);
        if(!tou.k && tou.x == ex && tou.y == ey)
        return tou.t;
        if(tou.k == 0)
        {
            //上
            X1.x = tou.x - 1 ,X1.y = tou.y ,X1.k = 1;
            X2.x = tou.x - 2 ,X2.y = tou.y ,X2.k = 3;
            if(ok(X1.x ,X1.y ,X1.k) && ok(X2.x ,X2.y ,X2.k))
            {
                mark[X1.x][X1.y][X1.k] = mark[X2.x][X2.y][X2.k] = 1;
                X1.t = tou.t + 1;
                q.push(X1);
            }

//下
            X1.x = tou.x + 1 ,X1.y = tou.y ,X1.k = 3;
            X2.x = tou.x + 2 ,X2.y = tou.y ,X2.k = 1;
            if(ok(X1.x ,X1.y ,X1.k) && ok(X2.x ,X2.y ,X2.k))
            {
                mark[X1.x][X1.y][X1.k] = mark[X2.x][X2.y][X2.k] = 1;
                X2.t = tou.t + 1;
                q.push(X2);
            }

//左
            X1.x = tou.x ,X1.y = tou.y - 1 ,X1.k = 4;
            X2.x = tou.x ,X2.y = tou.y - 2 ,X2.k = 2;
            if(ok(X1.x ,X1.y ,X1.k) && ok(X2.x ,X2.y ,X2.k))
            {
                mark[X1.x][X1.y][X1.k] = mark[X2.x][X2.y][X2.k] = 1;
                X1.t = tou.t + 1;
                q.push(X1);
            }

//右
            X1.x = tou.x ,X1.y = tou.y + 1 ,X1.k = 2;
            X2.x = tou.x ,X2.y = tou.y + 2 ,X2.k = 4;
            if(ok(X1.x ,X1.y ,X1.k) && ok(X2.x ,X2.y ,X2.k))
            {
                mark[X1.x][X1.y][X1.k] = mark[X2.x][X2.y][X2.k] = 1;
                X2.t = tou.t + 1;
                q.push(X2);
            }

}
        else if(tou.k == 1)
        {
            //上
            X1.x = tou.x - 2 ,X1.y = tou.y ,X1.k = 0;
            if(ok(X1.x ,X1.y ,X1.k) && map[X1.x][X1.y] == 1)
            {
                X1.t = tou.t + 1;
                mark[X1.x][X1.y][X1.k] = 1;
                q.push(X1);
            }

//下
            X1.x = tou.x + 1 ,X1.y = tou.y ,X1.k = 0;
            if(ok(X1.x ,X1.y ,X1.k) && map[X1.x][X1.y] == 1)
            {
                X1.t = tou.t + 1;
                mark[X1.x][X1.y][X1.k] = 1;
                q.push(X1);
            }

//左
            X1.x = tou.x ,X1.y = tou.y - 1 ,X1.k = 1;
            X2.x = tou.x - 1 ,X2.y = tou.y - 1 ,X2.k = 3;
            if(ok(X1.x ,X1.y ,X1.k) && ok(X2.x ,X2.y ,X2.k))
            {
                mark[X1.x][X1.y][X1.k] = mark[X2.x][X2.y][X2.k] = 1;
                X1.t = tou.t + 1;
                q.push(X1);
            }

//右
            X1.x = tou.x ,X1.y = tou.y + 1 ,X1.k = 1;
            X2.x = tou.x - 1 ,X2.y = tou.y + 1 ,X2.k = 3;
            if(ok(X1.x ,X1.y ,X1.k) && ok(X2.x ,X2.y ,X2.k))
            {
                mark[X1.x][X1.y][X1.k] = mark[X2.x][X2.y][X2.k] = 1;
                X1.t = tou.t + 1;
                q.push(X1);
            }

}
        else if(tou.k == 4)
        {
            //上
            X1.x = tou.x - 1 ,X1.y = tou.y ,X1.k = 4;
            X2.x = tou.x - 1 ,X2.y = tou.y - 1 ,X2.k = 2;
            if(ok(X1.x ,X1.y ,X1.k) && ok(X2.x ,X2.y ,X2.k))
            {
                mark[X1.x][X1.y][X1.k] = mark[X2.x][X2.y][X2.k] = 1;
                X1.t = tou.t + 1;
                q.push(X1);
            }
            //下
            X1.x = tou.x + 1 ,X1.y = tou.y ,X1.k = 4;
            X2.x = tou.x + 1 ,X2.y = tou.y - 1 ,X2.k = 2;
            if(ok(X1.x ,X1.y ,X1.k) && ok(X2.x ,X2.y ,X2.k))
            {
                mark[X1.x][X1.y][X1.k] = mark[X2.x][X2.y][X2.k] = 1;
                X1.t = tou.t + 1;
                q.push(X1);
            }
            //左
            X1.x = tou.x ,X1.y = tou.y - 2 ,X1.k = 0;
            if(ok(X1.x ,X1.y ,X1.k) && map[X1.x][X1.y] == 1)
            {
                X1.t = tou.t + 1;
                mark[X1.x][X1.y][X1.k] = 1;
                q.push(X1);
            }

//右
            X1.x = tou.x ,X1.y = tou.y + 1 ,X1.k = 0;
            if(ok(X1.x ,X1.y ,X1.k) && map[X1.x][X1.y] == 1)
            {
                X1.t = tou.t + 1;
                mark[X1.x][X1.y][X1.k] = 1;
                q.push(X1);
            }

}
    }
    return -1;
}

int main ()
{
    char str[505];
    int sx1 ,sx2 ,sy1 ,sy2 ,s;
    while(~scanf("%d %d" ,&n ,&m) && n + m)
    {
        s = 0;
        for(int i = 1 ;i <= n ;i ++)
        {
            scanf("%s" ,str);
            for(int j = 1 ;j <= m ;j ++)
            {
                if(str[j-1] == 'X')
                {
                    s ++;
                    if(s == 1) sx1 = i ,sy1 = j;
                    else sx2 = i ,sy2 = j;
                    map[i][j] = 1;
                }
                else if(str[j-1] == 'O')
                {
                    ex = i ,ey = j;
                    map[i][j] = 1;
                }
                else if(str[j-1] == 'E') map[i][j] = 2;
                else if(str[j-1] == '#') map[i][j] = 0;
                else map[i][j] = 1;
            }
        }
        if(s == 1) xin.x = sx1 ,xin.y = sy1 ,xin.k = 0 ,xin.t = 0;
        else
        {
            if(sx1 == sx2) xin.x = sx2 ,xin.y = sy2 ,xin.k = 4 ,xin.t = 0;
            else xin.x = xin.x = sx2 ,xin.y = sy2 ,xin.k = 1 ,xin.t = 0;
        }
        int ans = BFS();
        ans == -1 ? printf("Impossible\n") : printf("%d\n" ,ans);
    }
    return 0;
}

POJ3322滚箱子游戏(不错)相关推荐

  1. 使用C++代码打造:史上最恶心的“推箱子”游戏,你敢再坑爹点吗?

    根据J2ME版推箱子游戏改编,现改版为VC++版,功能上一模一样,不过现在可以在Windows上运行了,而非限制于手机.游戏界面看上去还不错. 项目截图: 代码截图: 推箱子游戲是一個來自日本的古老游 ...

  2. Unity3D游戏开发初探—4.开发一个“疯狂击箱子”游戏

    一.预备知识-对象的"生"与"死" (1)如何在游戏脚本程序中创建对象而不是一开始就创建好对象?->使用GameObject的静态方法:CreatePri ...

  3. Java 编写推箱子报告,推箱子游戏用java怎么去写

    推箱子游戏用java怎么去写 发布时间:2020-06-22 16:31:07 来源:亿速云 阅读:100 作者:清晨 这篇文章将为大家详细讲解有关推箱子游戏用java怎么写,小编觉得挺实用的,因此分 ...

  4. 以《少年三国志2》为例,分析数值驱动的滚服游戏设计

    一.前言 1)游戏简介 <少年三国志2>由上海游族信息技术有限公司制作发行的一款三国题材的横版卡牌手游,该作于2020年3月27日正式公开测试. 玩家在游戏内扮演一名在时空局实习的少年,因 ...

  5. EasyX实现推箱子游戏

    文章目录 1 项目需求 2 模块划分 3 项目实现 3.1 地图初始化 3.2 热键控制 3.3 推箱子控制 3.4 游戏结束 1 项目需求 实现一款推箱子游戏,效果如下图所示,具体规则: 箱子只能推 ...

  6. 项目: 推箱子游戏【c/c++】

    很早之前写的一个推箱子的游戏 目录 最终效果 代码 最终效果 代码 #include<stdio.h> #include<stdlib.h> #include<graph ...

  7. c语言多关卡推箱子程序,多关卡地图推箱子游戏

    多关卡地图推箱子游戏 # include # include # include //调出地图 void file(int map[14][16],int n,int flag) //n表示关卡数 , ...

  8. 推箱子java下载_Java实现简单推箱子游戏

    本文实例为大家分享了Java实现简单推箱子游戏的具体代码,供大家参考,具体内容如下 *编写一个简易的推箱子游戏,使用10*8的二维字符数据表示游戏画面,H表示墙壁; &表示玩家角色: o表示箱 ...

  9. 一文教你使用java开发一款推箱子游戏

    导读:社会在进步,人们生活质量也在日益提高.高强度的压力也接踵而来.社会中急需出现新的有效方式来缓解人们的压力.此次设计符合了社会需求,Java推箱子游戏可以让人们在闲暇之余,体验游戏的乐趣.具有操作 ...

最新文章

  1. node mysql 批量写入_请问如何使用node.js在MySQL中进行批量插入
  2. 荣耀20搭载鸿蒙,荣耀20系列刚发布,搭载鸿蒙系统新机来袭,余承东已准备好!...
  3. 精简自己20%的代码
  4. “面试不败计划”: java语言基础面试题(二)
  5. python random.choice报错_如何解决mtrand.RandomState.choice中的内存错误...
  6. oracle 中文查询不到,使用PLSQL查询Oracle语句中文无法匹配问题解决
  7. python中webdriver_浅谈python中selenium库调动webdriver驱动浏览器的实现原理
  8. 概率论-2.6 随机变量函数的分布
  9. python2和python3的默认编码_python2和python3哪个版本新
  10. java 采集 cms_开源 java CMS - FreeCMS2.3 Web页面信息采集
  11. DW里面html鼠标点击特效,dw制作鼠标经过时图像放大鼠标离开图像回原形效果
  12. 自己动手架设linux下Web服务器(图)2
  13. 第6章 if命令讲解
  14. Win7批量压缩照片
  15. TI AM335x Linux MUX hacking
  16. python决策树预测模型_带决策树回归模型的负交叉值得分
  17. oracle存储过程插表,oracle 一张表插入另外一张表 存储过程
  18. java便利店库存管理系统_便利店库存管理系统可以做什么?
  19. python因子分析法详细步骤_实用干货!因子分析超全步骤总结!
  20. 关于oracle端口映射的远程连接

热门文章

  1. 【翻译】为什么 goroutine 的栈内存无穷大?
  2. 动态产生一个TextBox,并使输入的文本靠右对齐
  3. 802.1x认证协议的应用
  4. 后盾网lavarel视频项目---lavarel用户认证实例
  5. Docker部署ELK 日志归集
  6. win10安装mysql
  7. 关于模型复杂度的一个想法
  8. 数据降维(特征提取)和特征选择有什么区别?
  9. 《当程序员的那些狗日日子》(十二)公司里的靓丽风景
  10. Vue之element table 后端排序实现