POJ3322滚箱子游戏(不错)

该博客介绍了POJ3322题目,是一个关于在一个平面上滚动1*1*2长方体的游戏。游戏规则包括初始状态、滚动条件、位置承重限制以及目标状态。博主通过搜索算法解决此问题,用广度优先搜索(BFS)来找到从起始位置到达洞口的最短步数,并详细讲解了状态标记和搜索策略。
摘要由CSDN通过智能技术生成
题意:
      讲的是一个游戏,就是在一个平面上滚动一个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][x
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值