[HDU 1254] 推箱子
题目链接: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] 推箱子相关推荐
- hdu.1254.推箱子(bfs + 优先队列)
推箱子 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submis ...
- hdu 1254 推箱子(嵌套搜索,bfs中有dfs)
推箱子 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submis ...
- HDU 1254推箱子
推箱子 Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Submissio ...
- HDU 1254 推箱子 BFS
囧,一开始没有管人的情况,只看箱子,果然SB了. #include <cstdio> #include <cstring> #include <iostream> ...
- 【HDU - 1254 】推箱子 (双bfs)
题干: 推箱子是一个很经典的游戏.今天我们来玩一个简单版本.在一个M*N的房间里有一个箱子和一个搬运工,搬运工的工作就是把箱子推到指定的位置,注意,搬运工只能推箱子而不能拉箱子,因此如果箱子被推到一个 ...
- 推箱子 (hdu1254)(bfs双重广搜)
推箱子 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submissio ...
- C++ 小游戏之推箱子
做完C的贪吃蛇游戏后,感觉还不错,刚好记得在HDU上做过一道关于推箱子游戏的算法题目,即双BFS. 所以我决定来做做C++的小游戏推箱子,由于刚学C++,对C++还是不很熟练,但是思路还是很清楚的, ...
- 推箱子2-向右推!_保持冷静,砍箱子-me脚
推箱子2-向右推! Hack The Box (HTB) is an online platform allowing you to test your penetration testing ski ...
- c++ 小游戏_C/C++编程笔记:C语言写推箱子小游戏,大一学习C语言练手项目
C语言,作为大多数人的第一门编程语言,重要性不言而喻,很多编程习惯,逻辑方式在此时就已经形成了.这个是我在大一学习 C语言 后写的推箱子小游戏,自己的逻辑能力得到了提升,在这里同大家分享这个推箱子小游 ...
最新文章
- php mysql 修改密码_设置及修改MySQL root用户密码
- 【相关性搜索】 多字段搜索的两种方式——词中心与字段中心
- Mac OS X Yosemite Arduino安装CH340 USB转串口驱动
- 计算机专业 美国 硕士,【美国计算机硕士排名】美国计算机硕士专业怎么样
- 云原生时代|分布式系统设计知识图谱(内含22个知识点)
- 科普dip,dp,sp,dpi,ppi,px,Density
- Linux 挂载windows网络共享文件 /etc/fstab功能详解
- CWnd类与Windows窗口的关系-3、CWnd类如何封装Windows窗口
- python 近期用到的基础知识汇总(八)
- 使用HttpClient 发送 GET、POST、PUT、Delete请求及文件上传
- 5. php 基本数据类型
- 如何把书上的字弄到电脑
- 计算机技术与软件考试高级难么,计算机技术与软件专业技术资格考试高级哪个好考...
- java csv oracle数据库_从文件(*.csv或*.txt)导入Oracle数据库Java源代码
- Ultra Recal 一款DIY的个人管理软件
- 主流云计算厂商产品服务介绍
- 计算机cpu的主频参数,电脑CPU的参数怎么看?原来这么简单!
- NLTK使用教程(持续更新ing...)
- 李刚疯狂java抄袭,推荐:疯狂java讲义--李刚著作(3)
- python多线程tomorrow的使用