题意:
讲的是一个游戏,就是在一个平面上滚动一个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
讲的是一个游戏,就是在一个平面上滚动一个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