题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1254

  1 #include<cstdio>
  2 #include<queue>
  3 #include<cstring>
  4 using namespace std;
  5
  6 #define INF 0xfffffff
  7
  8 const int maxn = 10;
  9 int go[4][2] = {0,1,0,-1,1,0,-1,0};
 10 int maze[10][10];
 11 int vis[10][10][10][10]; //是由人和箱子的位置这两个状态共同决定
 12 int m,n;
 13
 14 struct Point
 15 {
 16     int x,y;
 17     int bx,by;
 18     int cnt;
 19 }P;
 20
 21 //用这个函数替代memset(),不然会导致wronganswer
 22 void init()
 23 {
 24     for(int i=0; i<maxn; i++)
 25         for(int j=0; j<maxn; j++)
 26             for(int k=0; k<maxn; k++)
 27                 for(int p=0; p<maxn; p++)
 28                     vis[i][j][k][p] = INF;
 29 }
 30
 31 bool OKman(Point s)
 32 {
 33     return s.x>=0 && s.x<m && s.y>=0 && s.y<n && maze[s.x][s.y]!=1 && s.cnt < vis[s.x][s.y][s.bx][s.by];
 34 }
 35
 36 bool OKbox(Point s)
 37 {
 38     return s.bx>=0 && s.bx<m && s.by>=0 && s.by<n && maze[s.bx][s.by]!=1 && s.cnt < vis[s.x][s.y][s.bx][s.by];
 39 }
 40
 41 int BFS()
 42 {
 43     Point Pn;
 44     queue<Point> Q;
 45     Q.push(P);
 46     int ans = INF;
 47     vis[P.x][P.y][P.bx][P.by] = 1;
 48     while(!Q.empty())
 49     {
 50         P = Q.front();
 51         Q.pop();
 52         if(maze[P.bx][P.by] == 3)
 53         {
 54             ans = min(ans,P.cnt);
 55         }
 56         for(int i=0;i<4;i++)
 57         {
 58             Pn = P;
 59             Pn.x += go[i][0];
 60             Pn.y += go[i][1];
 61             if(OKman(Pn)) //判断人走下一步是否合法
 62             {
 63                 if(Pn.x == Pn.bx && Pn.y == Pn.by) //在人走下一步合法的条件下,判断人和箱子是否重合,重合就得移动箱子
 64                 {
 65                     Pn.bx += go[i][0];
 66                     Pn.by += go[i][1];
 67                     Pn.cnt++;
 68                     if(OKbox(Pn)) //判断箱子走的下一步是否合法,合法就加入队列
 69                     {
 70                         vis[Pn.x][Pn.y][Pn.bx][Pn.by] = Pn.cnt;
 71                         Q.push(Pn);
 72                     }
 73                 }
 74                 else //如果人和箱子不重合,也就是人还不能推箱子
 75                 {
 76                     vis[Pn.x][Pn.y][Pn.bx][Pn.by] = Pn.cnt;
 77                     Q.push(Pn);
 78                 }
 79             }
 80         }
 81     }
 82     return ans;
 83 }
 84 int main()
 85 {
 86     int T;
 87     scanf("%d",&T);
 88     while(T--)
 89     {
 90         init();
 91         scanf("%d%d",&m,&n);
 92         for(int i=0;i<m;i++)
 93             for(int j=0;j<n;j++)
 94             {
 95                 scanf("%d",&maze[i][j]);
 96                 if(maze[i][j] == 4)
 97                     P.x=i,P.y=j,P.cnt=0;
 98                 else if(maze[i][j] == 2)
 99                     P.bx=i,P.by=j;
100             }
101 //        memset(vis,INF,sizeof(vis));  用memset会导致wronganswer,原因后续跟上.
102         int k = BFS();
103         if(k == INF)
104             k = -1;
105         printf("%d\n",k);
106     }
107     return 0;
108 }

转载于:https://www.cnblogs.com/youpeng/p/10281054.html

[HDU 1254] 推箱子相关推荐

  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推箱子

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

  4. HDU 1254 推箱子 BFS

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

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

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

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

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

  7. C++ 小游戏之推箱子

    做完C的贪吃蛇游戏后,感觉还不错,刚好记得在HDU上做过一道关于推箱子游戏的算法题目,即双BFS. 所以我决定来做做C++的小游戏推箱子,由于刚学C++,对C++还是不很熟练,但是思路还是很清楚的, ...

  8. 推箱子2-向右推!_保持冷静,砍箱子-me脚

    推箱子2-向右推! Hack The Box (HTB) is an online platform allowing you to test your penetration testing ski ...

  9. c++ 小游戏_C/C++编程笔记:C语言写推箱子小游戏,大一学习C语言练手项目

    C语言,作为大多数人的第一门编程语言,重要性不言而喻,很多编程习惯,逻辑方式在此时就已经形成了.这个是我在大一学习 C语言 后写的推箱子小游戏,自己的逻辑能力得到了提升,在这里同大家分享这个推箱子小游 ...

最新文章

  1. php mysql 修改密码_设置及修改MySQL root用户密码
  2. 【相关性搜索】 多字段搜索的两种方式——词中心与字段中心
  3. Mac OS X Yosemite Arduino安装CH340 USB转串口驱动
  4. 计算机专业 美国 硕士,【美国计算机硕士排名】美国计算机硕士专业怎么样
  5. 云原生时代|分布式系统设计知识图谱(内含22个知识点)
  6. 科普dip,dp,sp,dpi,ppi,px,Density
  7. Linux 挂载windows网络共享文件 /etc/fstab功能详解
  8. CWnd类与Windows窗口的关系-3、CWnd类如何封装Windows窗口
  9. python 近期用到的基础知识汇总(八)
  10. 使用HttpClient 发送 GET、POST、PUT、Delete请求及文件上传
  11. 5. php 基本数据类型
  12. 如何把书上的字弄到电脑
  13. 计算机技术与软件考试高级难么,计算机技术与软件专业技术资格考试高级哪个好考...
  14. java csv oracle数据库_从文件(*.csv或*.txt)导入Oracle数据库Java源代码
  15. Ultra Recal 一款DIY的个人管理软件
  16. 主流云计算厂商产品服务介绍
  17. 计算机cpu的主频参数,电脑CPU的参数怎么看?原来这么简单!
  18. NLTK使用教程(持续更新ing...)
  19. 李刚疯狂java抄袭,推荐:疯狂java讲义--李刚著作(3)
  20. python多线程tomorrow的使用

热门文章

  1. WhatFontIs - 字体百科全书,没有不认识的字体
  2. 自定义ClassLoader实现java应用核心逻辑模块热部署
  3. 再谈RPC--长长的手,抓住了离去的你
  4. 业务工作流平台设计(九)
  5. 小波变换和小波包变换
  6. 基于Grafana的Repeate Panel快速定义面板
  7. Windows下基于python3使用word2vec训练中文维基百科语料(一)
  8. Sql Server 2012 分页方法分析(offset and fetch)
  9. JQuery解析JSON数据
  10. SQL Server 备份还原造成孤立用户的问题