hdu 1254 推箱子(嵌套搜索,bfs中有dfs)
推箱子
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 6416 Accepted Submission(s):
1834
现在给定房间的结构,箱子的位置,搬运工的位置和箱子要被推去的位置,请你计算出搬运工至少要推动箱子多少格.

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
struct node
{
int x,y; //箱子的位置
int xx,xy; //人的位置
int t; //箱子动的格数
} s1,s2;
int f[][]= {,,,-,,,-,}; //方向变量
int map[][]; //记录地图
int vis[][][][]; //四维数组标记,同时记录箱子的位置和人的位置,去除重复的
int n,m; //边界
int a1,a2,b1,b2; //初始值
int flag[][],kk; bool xx(int a,int b)
{
if(a>=&&a<n&&b>=&&b<m&&map[a][b]!=) return true;
return false;
} void DFS(int nx,int ny,int mx,int my)
{
if(nx==mx&&ny==my) //如果从要到的点能搜到此时人的位置,则人可以走过来
{
kk=; //若能走来,标记为1
return;
}
for(int i=; i<&&!kk; i++)
{
int x=nx+f[i][];
int y=ny+f[i][];
if(xx(x,y)&&!flag[x][y])
{
flag[x][y]=; //走过的点标记为1
DFS(x,y,mx,my); //继续搜索
}
}
} void BFS()
{
queue<node> q;
while(!q.empty())
q.pop();
int nx,ny;
s1.x=a1; //初始化
s1.y=b1;
s1.xx=a2;
s1.xy=b2;
s1.t=;
vis[a1][b1][a2][b2]=; //开始状态标记为已出现
q.push(s1);
while(!q.empty())
{
s1=q.front();
q.pop();
if(map[s1.x][s1.y]==) //箱子到达指定位置后,队列循环结束
{
printf("%d\n",s1.t);
return;
}
for(int i=; i<; i++)
{
s2.x=s1.x+f[i][]; //箱子移动后的位置
s2.y=s1.y+f[i][];
nx=s1.x-f[i][]; //如果箱子能移动到那个位置,人必须能走到这个点
ny=s1.y-f[i][];
if(xx(s2.x,s2.y)&&xx(nx,ny)&&!vis[s2.x][s2.y][nx][ny])
//xx()函数判断是否超边界和是否是墙,箱子移动后的位置和人要到的位置都必须满足,并且此时这个状态是没有出现过的
{
memset(flag,,sizeof(flag)); //地图中所有不是墙的点都能走
flag[nx][ny]=flag[s1.x][s1.y]=; //箱子移动前的位置和人要到的位置都看做墙
kk=; //标记人是否能走过来
DFS(nx,ny,s1.xx,s1.xy); //深搜查询
if(kk) //如果人能走到
{
vis[s2.x][s2.y][nx][ny]=; //这个状态标记已出现
s2.xx=nx; //记录此时人到的位置
s2.xy=ny;
s2.t=s1.t+; //步数加一
q.push(s2); //入队列
}
}
}
}
printf("-1\n"); //如果不能到,则输出-1
return;
}
int main()
{
int T,i,j;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
memset(vis,,sizeof(vis)); //标记全部初始化为0
for(i=; i<n; i++)
for(j=; j<m; j++)
{
scanf("%d",&map[i][j]);
if(map[i][j]==) //记录箱子的起始位置
{
a1=i;
b1=j;
}
if(map[i][j]==) //记录人的起始位置
{
a2=i;
b2=j;
}
}
BFS();
}
return ;
}
hdu 1254 推箱子(嵌套搜索,bfs中有dfs)的更多相关文章
- hdu 1254 推箱子(搜索)
我写的第一道感觉比较难的搜索 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1254 首先要推箱子的话要满足人能够在箱子旁边,而且人的对面也是可通的. ...
- hdu 1254 推箱子(双重bfs)
题目链接 Problem Description 推箱子是一个很经典的游戏.今天我们来玩一个简单版本.在一个M*N的房间里有一个箱子和一个搬运工,搬运工的工作就是把箱子推到指定的位置,注意,搬运工只能 ...
- HDU 1254 推箱子(BFS加优先队列)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1254 推箱子 Time Limit: 2000/1000 MS (Java/Others) Me ...
- HDU 1254 推箱子 BFS
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1254 题目分析: 做这道题,感觉挺简单的,做着做着就错了20次, 我也是醉了, WA到吐的节奏啊! 思 ...
- hdu - 1254 推箱子 (bfs+bfs)
http://acm.hdu.edu.cn/showproblem.php?pid=1254 题目意思很简单,只要思路对就好. 首先考虑搬运工能否到达推箱子的那个点,这个可以根据箱子前进方向得出搬运工 ...
- HDU 1254 推箱子(BFS)
Problem Description 推箱子是一个很经典的游戏.今天我们来玩一个简单版本.在一个M*N的房间里有一个箱子和一个搬运工,搬运工的工作就是把箱子推到指定的位置,注意,搬运工只能推箱子而不 ...
- hdu.1254.推箱子(bfs + 优先队列)
推箱子 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submis ...
- [HDU 1254] 推箱子
推箱子 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submis ...
- HDU 1254 推箱子游戏(搞了一下午。。。)
中文题目:http://acm.hdu.edu.cn/showproblem.php?pid=1254 一开始常规的人用来做主导,想着想着不对劲,其实是箱子为主导,人只是箱子能否推进的一个判断. 可以 ...
随机推荐
- Header解析
不管是作为后端还是前端开发人员,对于web请求的过程和参数都是需要了解的. 下面是对一次简单的http请求的header分析,作为自己的一个总结,也希望对大家有所帮助. 以Chrome为例: 我们对h ...
- 【JZOJ3297】【SDOI2013】逃考(escape)
Mission 高考又来了,对于不认真读书的来讲真不是个好消息.为了小杨能在家里认真读书,他的亲戚决定驻扎在他的家里监督他学习,有爷爷奶奶.外公外婆.大舅.大嫂.阿姨-- 小杨实在是忍无可忍了,这种生 ...
- mysql全连接
Oracle数据库支持full join,mysql是不支持full join的,但仍然可以同过左外连接+ union+右外连接实现 SELECT * FROM t1 LEFT JOIN t2 ON ...
- NOIP模拟 17.8.17
NOIP模拟17.8.17 A 小 G 的字符串文件名 输入文件 输出文件 时间限制 空间限制str.pas/c/cpp str.in str.out 1s 128MB[题目描述]有一天,小 L 给小 ...
- MSSQL2008 数据压缩方法
数据压缩功能使得SOL Server 2008允许在表.索引和分区中执行数据压缩,这样不仅可以节省磁盘空间,而且允许更多数据置入RAM中,从而提升数据库查询的性能. 1.启用行压缩 如果我们要在指定的 ...
- 深入浅出Cocoa之消息【转】
在入门级别的ObjC 教程中,我们常对从C++或Java 或其他面向对象语言转过来的程序员说,ObjC 中的方法调用(ObjC中的术语为消息)跟其他语言中的方法调用差不多,只是形式有些不同而已. 譬如 ...
- 类似淘宝五星点评 ,Jquery实现代码
<!--默认五星,根据鼠标点击判断--> <!DOCTYPE html><html lang="en"><head> <met ...
- jQuery迷你帮助查找功能
在线演示 本地下载
- C++:for范围循环特点--自我理解
for(declaration : expression)statement for(xx-type i : P)....其一:for范围类型循环在循环前,可能会对p所在的队列里,对每一个对象进行一次 ...
- springboot对shiro进行mock单元测试
环境:junit-5.Spring5.0.x.Spring Boot 2.0.x 以下是用来权限测试的接口: @ApiOperation("[可接入]分页查询管理员") @ApiR ...