传送门

题意

给出一副图

0.空地1.墙2.箱子3.目的地4.人所在的位置

问最少几步能将箱子推到目的地

分析

这道题难度略大(菜鸡),首先用vis[bx][by][mx][my]记录当箱子(bx,by)和人(mx,my)是否被访问过,用一个bfs求出最短路,另外dfs判断人是否能够到达推箱子的位置,写起来比较复杂,(弱鸡)

trick

代码

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<queue>
  5. using namespace std;
  6. int t,n,m,mp[10][10],bx,by,mx,my,prex,prey,flag,ans;
  7. int dir[4][2]={0,1,-1,0,0,-1,1,0};
  8. int vis_p[10][10],vis[10][10][10][10];
  9. struct node
  10. {
  11. int bx,by;
  12. int mx,my;
  13. int step;
  14. }tmp,p;
  15. bool check(int x,int y)
  16. {
  17. if(x>=1&&x<=n&&y>=1&&y<=m&&mp[x][y]!=1) return 1;
  18. return 0;
  19. }
  20. void dfs(int prex,int prey,int mx,int my)
  21. {
  22. if(prex==mx&&prey==my) { flag=1;return ; }
  23. if(flag) return ;
  24. for(int i=0;i<4;++i)
  25. {
  26. int x=prex+dir[i][0];
  27. int y=prey+dir[i][1];
  28. if(check(x,y)&&!vis_p[x][y])
  29. {
  30. vis_p[x][y]=1;
  31. dfs(x,y,mx,my);
  32. }
  33. }
  34. }
  35. void bfs2(int bx,int by,int mx,int my)
  36. {
  37. memset(vis,0,sizeof(vis));
  38. ans=-1;
  39. queue<node>pq;
  40. while(!pq.empty()) pq.pop();
  41. tmp={bx,by,mx,my,0};
  42. pq.push(tmp);
  43. while(!pq.empty())
  44. {
  45. tmp=pq.front();pq.pop();
  46. if(mp[tmp.bx][tmp.by]==3) { ans=tmp.step;return ; }
  47. for(int i=0;i<4;++i)
  48. {
  49. p=tmp;
  50. p.bx+=dir[i][0],p.by+=dir[i][1];
  51. prex=tmp.bx-dir[i][0],prey=tmp.by-dir[i][1];
  52. if(!check(p.bx,p.by)) continue;
  53. if(!check(prex,prey)) continue;
  54. if(vis[p.bx][p.by][prex][prey]) continue;
  55. memset(vis_p,0,sizeof(vis_p));
  56. vis_p[tmp.bx][tmp.by]= vis_p[prex][prey]=1;
  57. flag=0;
  58. dfs(prex,prey,tmp. mx,tmp.my);
  59. if(!flag) continue;
  60. vis[p.bx][p.by][prex][prey]=1;
  61. p.mx=prex,p.my=prey;
  62. p.step++;
  63. pq.push(p);
  64. }
  65. }
  66. }
  67. int main()
  68. {
  69. for(scanf("%d",&t);t--;)
  70. {
  71. scanf("%d %d",&n,&m);
  72. for(int i=1;i<=n;++i)for(int j=1;j<=m;++j)
  73. {
  74. scanf("%d",&mp[i][j]);
  75. if(mp[i][j]==4) { mx=i,my=j; }
  76. if(mp[i][j]==2) { bx=i,by=j; }
  77. }
  78. bfs2(bx,by,mx,my);
  79. printf("%d\n",ans);
  80. }
  81. }
  82. /*
  83. 6666
  84. 5 5
  85. 3 0 1 0 0
  86. 1 0 1 4 0
  87. 0 0 1 0 0
  88. 1 0 2 0 0
  89. 0 0 0 0 0
  90. 5 5
  91. 0 3 0 0 0
  92. 1 0 1 4 0
  93. 0 0 1 0 0
  94. 1 0 2 0 0
  95. 0 0 0 0 0
  96. 5 5
  97. 0 0 0 0 0
  98. 0 0 0 0 0
  99. 0 0 0 0 0
  100. 1 1 2 1 1
  101. 4 0 3 0 0
  102. */

HDU1254:推箱子(bfs+dfs)的更多相关文章

  1. HDU1254 推箱子(BFS) 2016-07-24 14:24 86人阅读 评论(0) 收藏

    推箱子 Problem Description 推箱子是一个很经典的游戏.今天我们来玩一个简单版本.在一个M*N的房间里有一个箱子和一个搬运工,搬运工的工作就是把箱子推到指定的位置,注意,搬运工只能推 ...

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

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

  3. HDU 1254 推箱子 BFS

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1254 题目分析: 做这道题,感觉挺简单的,做着做着就错了20次, 我也是醉了, WA到吐的节奏啊! 思 ...

  4. 推箱子 BFS

    [编程题] 推箱子 大家一定玩过“推箱子”这个经典的游戏.具体规则就是在一个N*M的地图上,有1个玩家.1个箱子.1个目的地以及若干障碍,其余是空地.玩家可以往上下左右4个方向移动,但是不能移动出地图 ...

  5. hdu - 1254 推箱子 (bfs+bfs)

    http://acm.hdu.edu.cn/showproblem.php?pid=1254 题目意思很简单,只要思路对就好. 首先考虑搬运工能否到达推箱子的那个点,这个可以根据箱子前进方向得出搬运工 ...

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

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

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

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

  8. HDU1254--推箱子(BFS+DFS)

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

  9. HDU 1254 推箱子(BFS)

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

随机推荐

  1. php 压缩数据存储

    php 压缩数据存储 当接收到大量的数据时,存储到数据库和从数据库读取时,时间都比较慢,所以压缩一下入库可能会好一点. 仅供参考!!! 封装的压缩数据函数: /** * 压缩数据 * @param s ...

  2. oc温习六:预处理指令

    预处理:分析程序前先处理的语句,它可以识别散布在程序中的特定语句.所有的预处理语句都适用“#”开头,这个符号必须是一行中的第一个非空字符. 预处理可以大概分为三类:文件包含.宏定义和条件编译. 1.文 ...

  3. 一份关于webpack2和模块打包的新手指南(二)

    插件 我们已经看到一个内置的webpack插件的例子,在npm run build脚本中调用的webpack -p命令就是使用webpack附带的UglifyJsPlugin插件以生产模式压缩打包文件 ...

  4. asterisk 通道变量

    ${ACCOUNTCODE}: 用户计费帐号 sip.conf 里的 account=XXXX ${ANSWEREDTIME}: 通话时长(秒) ${BLINDTRANSFER}: 通道是否为转接类型 ...

  5. nginx.org与nginx.com有什么区别(Nginx与Nginx Plus)

    nginx.org是开源社区,管理着Nginx开源版. nginx.xom是商业社区,管理着Nginx Plus商业版. 商业版和开源版是有很大区别的,服务还加更强大的功能,当然依托开源社区加载第三方 ...

  6. MySQL入门笔记 - 数据类型

    参考书籍<MySQL入门很简单> 数据类型是数据的一种属性,可以决定数据的存储方式.有效范围和相应的限制. 1.整数类型   1.1 MySQL的整数类型 MySQL中int类型和inte ...

  7. Eureka 简介

    Eureka 简介

  8. 实例 tar备份以日期命名

    tar备份以日期命名****************************************************************************************#v ...

  9. Linux系统启动流程分析

    作者:郭孝星 微博:郭孝星的新浪微博 邮箱:allenwells@163.com 博客:http://blog.csdn.net/allenwells Github:https://github.co ...

  10. leetCode 94.Binary Tree Inorder Traversal(二叉树中序遍历) 解题思路和方法

    Given a binary tree, return the inorder traversal of its nodes' values. For example: Given binary tr ...