题干:

推箱子是一个很经典的游戏.今天我们来玩一个简单版本.在一个M*N的房间里有一个箱子和一个搬运工,搬运工的工作就是把箱子推到指定的位置,注意,搬运工只能推箱子而不能拉箱子,因此如果箱子被推到一个角上(如图2)那么箱子就不能再被移动了,如果箱子被推到一面墙上,那么箱子只能沿着墙移动.

现在给定房间的结构,箱子的位置,搬运工的位置和箱子要被推去的位置,请你计算出搬运工至少要推动箱子多少格.

Input

输入数据的第一行是一个整数T(1<=T<=20),代表测试数据的数量.然后是T组测试数据,每组测试数据的第一行是两个正整数M,N(2<=M,N<=7),代表房间的大小,然后是一个M行N列的矩阵,代表房间的布局,其中0代表空的地板,1代表墙,2代表箱子的起始位置,3代表箱子要被推去的位置,4代表搬运工的起始位置.

Output

对于每组测试数据,输出搬运工最少需要推动箱子多少格才能帮箱子推到指定位置,如果不能推到指定位置则输出-1.

Sample Input

1
5 5
0 3 0 0 0
1 0 1 4 0
0 0 1 0 0
1 0 2 0 0
0 0 0 0 0

Sample Output

4

解题报告:

很久之前的一道bfs。参照了网上的思路,叫他双bfs。就是同时进行两个bfs。记录状态(结构体)和标记状态(bool的数组)的时候也是用四维数组记录。

先让人动,如果人刚好走到箱子的位置,那么箱子再动,这样正好可以控制那个条件:箱子必须沿着人动的方向移动。

AC代码:

#include<bits/stdc++.h>using namespace std;int maze[9][9],vis[9][9][9][9],n,m;
int nx[4][2]= {1,0,0,-1,-1,0,0,1};struct node {int x,y,bx,by,step;bool friend operator < (const node &a, const node &b) {return a.step>b.step;}
} st;
int bfs() {int tx,ty,tbx,tby;node now,next;priority_queue<node> q;q.push(st);while(!q.empty()) {now=q.top();if(maze[now.bx][now.by]==3) return now.step;for(int i=0; i<4; i++) {tx=now.x+nx[i][0];ty=now.y+nx[i][1];if(tx>=0&&tx<n&&ty>=0&&ty<m&&maze[tx][ty]!=1) {next.x=tx;next.y=ty;next.bx=now.bx;next.by=now.by;next.step=now.step;if(tx==now.bx&&ty==now.by) {tbx=tx+nx[i][0];tby=ty+nx[i][1];if(tbx>=0&&tbx<n&&tby>=0&&tby<m&&maze[tbx][tby]!=1) {next.bx=tbx;next.by=tby;next.step++;if(vis[tx][ty][next.bx][next.by]==0) {vis[tx][ty][next.bx][next.by]=1;q.push(next);}}} else if(vis[tx][ty][next.bx][next.by]==0) {vis[tx][ty][next.bx][next.by]=1;q.push(next);}}}q.pop();}return -1;
}int main() {int t;scanf("%d",&t);while(t--) {scanf("%d%d",&n,&m);memset(vis,0,sizeof(vis));for(int i=0; i<n; i++) {for(int j=0; j<m; j++) {scanf("%d",&maze[i][j]);if(maze[i][j]==4) {st.x=i;st.y=j;maze[i][j]=0;}if(maze[i][j]==2) {st.bx=i;st.by=j;maze[i][j]=0;}}}st.step=0;vis[st.x][st.y][st.bx][st.by]=1;printf("%d\n",bfs());}return 0;
}

【HDU - 1254 】推箱子 (双bfs)相关推荐

  1. hdu.1254.推箱子(bfs + 优先队列)

    推箱子 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submis ...

  2. hdu 1254 推箱子(嵌套搜索,bfs中有dfs)

    推箱子 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submis ...

  3. [HDU 1254] 推箱子

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1254 1 #include<cstdio> 2 #include<queue> ...

  4. HDU 1254推箱子

    推箱子 Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Submissio ...

  5. HDU 1254 推箱子 BFS

    囧,一开始没有管人的情况,只看箱子,果然SB了. #include <cstdio> #include <cstring> #include <iostream> ...

  6. LeetCode 1263. 推箱子(BFS+DFS / 自定义哈希set)

    文章目录 1. 题目 2. 解题 2.1 超时解 2.2 BFS + DFS 1. 题目 「推箱子」是一款风靡全球的益智小游戏,玩家需要将箱子推到仓库中的目标位置. 游戏地图用大小为 n * m 的网 ...

  7. 推箱子 (hdu1254)(bfs双重广搜)

    推箱子 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submissio ...

  8. hdu 1254(dfs+bfs+优先队列)

    推箱子 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Problem Desc ...

  9. 【嵌套bfs】A - Pushing Boxes POJ - 1475 推箱子

    https://vjudge.net/contest/387870#problem/A 题目描述 Imagine you are standing inside a two-dimensional m ...

最新文章

  1. 修复阻止程序安装或删除的问题
  2. 全球及中国甲醇催化剂行业前景动态与市场需求调研报告2022版
  3. 历届奥运会中国金牌数
  4. 【论文解读】CIKM20-MiNet:阿里|跨域点击率预估混合兴趣模型
  5. Js 与 as 相互通信
  6. SQL2000和SQL2005和SQL2008同时安装问题
  7. 【必备干货】1000字讲清3大财务数据表
  8. UI:使用 pod 引入 AFNetworking
  9. congestion map解读
  10. 【Django 2021年最新版教程15】数据库定义 models字段类型 限制 用法 总结
  11. 典型的对称加密和非对称加密算法有哪些
  12. 地图比例尺、瓦片切片方案、EPSG
  13. 逃出你的肖申克(五):看不见的牢笼(上)
  14. UEFI规范驱动模型(二):驱动加载过程
  15. Garbage First (G1) GC垃圾回收器:区域化分代式【图文】
  16. php ldap 登陆验证,LDAP用户验证功能简介
  17. AppleTV相关使用教程
  18. APM的3DR无线数传的安装和调试
  19. tabindex,role属性
  20. 使用Verilog来实现奇数分频

热门文章

  1. [剑指offer]面试题第[25]题[Leedcode][JAVA][第21题][合并两个有序链表]
  2. [剑指offer][JAVA][面试题56 - I][第260题][位运算][HashSet]
  3. [剑指offer][JAVA][第62题][约瑟夫环][LinkedList vs ArrayList]
  4. 安卓开发toolbar设置logo_Android之ToolBar的使用
  5. python函数拟合编程_Python应用实现双指数函数及拟合代码实例
  6. android 画布心形,Android CustomShapeImageView对图片进行各种样式裁剪:圆形、星形、心形、花瓣形等...
  7. 磁盘剩余空间策略_MySQL磁盘消耗迅猛掌握这点就够了,包你事半功倍
  8. e记法 python 底数_备战python二级
  9. mvn 汇编_2020年简单的早安共勉句子短信汇编58条
  10. halcon旋转后坐标_FPGA大赛【八】具体模块设计图像旋转方案