推箱子

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 6021    Accepted Submission(s): 1718

Problem Description
推箱子是一个很经典的游戏.今天我们来玩一个简单版本.在一个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

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<math.h>
 4 #include<queue>
 5 int T ;
 6 int n , m ;
 7 const int M = 10 ;
 8 int map[M][M] ;
 9 bool vis[M][M][M][M] ;
10 int move[][2] = {{1,0} , {-1 , 0} , {0,1} , {0 , -1} } ;
11 struct node
12 {
13     int x , y ;
14     int a , b ;
15     int time ;
16     bool operator < (const node &rhs ) const
17     {
18         return time > rhs.time ;
19     }
20 };
21
22 int bfs (int sx , int sy , int mx , int my , int ex , int ey)
23 {
24     //printf ("Last---> (%d,%d)\n" , ex , ey ) ;
25     node ans , tmp ;
26     std::priority_queue<node> q ;
27     memset (vis , 0 , sizeof(vis)) ;
28     while ( !q.empty ()) q.pop () ;
29     q.push ( (node) {sx , sy , mx , my , 0}) ;
30     vis[sx][sy][mx][my] = 1 ;
31     if (mx == ex && my == ey) return 0 ;
32     while ( !q.empty ()) {
33         ans = q.top () ; q.pop () ;
34        // printf ("S----(%d,%d) tui (%d,%d)\n" , ans.x , ans.y , ans.a , ans.b ) ;
35         for (int i = 0 ; i < 4 ; i ++) {
36             tmp = ans ;
37             tmp.x += move[i][0] ; tmp.y += move[i][1] ;
38             if (tmp.x < 0 || tmp.y < 0 || tmp.x == n || tmp.y == m) continue ;
39             if (map[tmp.x][tmp.y] == 1 ) continue ;
40             if (tmp.x == tmp.a && tmp.y == tmp.b ) {
41                 int x = tmp.x + move[i][0] , y = tmp.y + move[i][1] ;
42                 if (x < 0 || y < 0 || x == n || y == m) continue ;
43                 if (map[x][y] == 1) continue ;
44                 tmp.a = x , tmp.b = y ;
45                 tmp.time ++ ;
46             }
47             if (vis[tmp.x][tmp.y][tmp.a][tmp.b]) continue ;
48             vis[tmp.x][tmp.y][tmp.a][tmp.b] = 1 ;
49             q.push (tmp ) ;
50            // printf ("(%d,%d) tui (%d,%d)\n" , tmp.x , tmp.y , tmp.a , tmp.b ) ;
51             if (tmp.a == ex && tmp.b == ey) return tmp.time ;
52         }
53     }
54     return - 1 ;
55 }
56
57 int main ()
58 {
59     //freopen ("a.txt" , "r" , stdin ) ;
60     scanf ("%d" , &T ) ;
61     while (T --) {
62         scanf ("%d%d" , &n , &m ) ;
63         int k ;
64         int sx , sy , ex , ey , mx , my ;
65         for (int i = 0 ; i < n ; i ++) for (int j = 0 ; j < m ; j ++) scanf ("%d" , &map[i][j]) ;
66         for (int i = 0 ; i < n ; i ++) {
67             for (int j = 0 ; j < m ; j ++) {
68                 if (map[i][j] == 4) sx = i , sy = j ;
69                 else if (map[i][j] == 2) mx = i , my = j ;
70                 else if (map[i][j] == 3) ex = i , ey = j ;
71             }
72         }
73         if ( (k = bfs (sx , sy , mx , my , ex , ey )) == -1) puts ("-1") ;
74         else printf ("%d\n" , k ) ;
75     }
76     return 0 ;
77 }
78 [ Copy to Clipboard ]    [ Save to File]

View Code

转载于:https://www.cnblogs.com/get-an-AC-everyday/p/4494740.html

hdu.1254.推箱子(bfs + 优先队列)相关推荐

  1. HDU 1254 推箱子 BFS

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

  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(dfs+bfs+优先队列)

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

  5. HDU 1254推箱子

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

  6. hdu 5040 Instrusive【BFS+优先队列】

    2014北京网络赛09题,hdu 5040 这次网络赛真是惨,也怪做题策略没想好,当时切完签到题之类的水题之后,马上就去看06青蛙那题去了.结果被那只死青蛙给坑惨了T_T...搞了四小时没搞出来... ...

  7. 【HDU - 1254 】推箱子 (双bfs)

    题干: 推箱子是一个很经典的游戏.今天我们来玩一个简单版本.在一个M*N的房间里有一个箱子和一个搬运工,搬运工的工作就是把箱子推到指定的位置,注意,搬运工只能推箱子而不能拉箱子,因此如果箱子被推到一个 ...

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

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

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

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

最新文章

  1. Fedora WIFI频繁断开问题的解决办法
  2. S/4HANA生产订单的标准状态和透明工厂原型状态的映射
  3. python点击按钮创建进程_python-创建进程的三种方式
  4. GDB调试之ptrace实现原理
  5. Extjs 实战之 Ext.tree.TreePanel Tree无法显示
  6. 同宿舍的程序员毕业五年的现状:有人要当“螺丝钉”,有人头发掉光要出家...
  7. mysql 递归查询所有父级
  8. 《高等运筹学》复习题手写解答 Advanced Operations Research: Final Exam:Review Exercises
  9. angular获取当前路由信息
  10. Adobe MAX 2011第一天主题演讲实录
  11. 网盘中html怎么转成视频,怎么将百度网盘保存的MKV转换MP4格式
  12. 【柒穆雨】什么是平面设计,学习平面设计需要具备什么条件?
  13. 大疆FPGA/芯片开发工程师(A卷、B卷)笔试题详解
  14. 渗透测试-CTF_AWD专题篇
  15. TVS和一般的稳压二极管有什么区别? (转)
  16. 机器人总动员片尾曲歌词_机器人总动员中的所有歌曲叫什么名?
  17. 写给自己看的C4D建模笔记
  18. C++primer plus学习笔记
  19. 语法大全!20张图,彻底分清英语中的主、谓、宾、定、状、补
  20. 微信支付网页二维码NATIVE

热门文章

  1. 大屏某区域滚动效果循环
  2. nginx将ip+端口号映射为域名
  3. 【OpenCV】imread读取数据为空
  4. Shell 自定义函数
  5. Information_Schema系统表
  6. ZOJ 2562 More Divisors
  7. 【原创】简单轻松浏览FTP
  8. ztree改变节点颜色
  9. CreateProcess error = 2,系统找不到指定的文件
  10. Java拦截器,过滤器,监听器(三大器)对比