HDU_1254——推箱子,两次BFS
这题做的一把鼻涕一把泪,果断考虑不周555
现在给定房间的结构,箱子的位置,搬运工的位置和箱子要被推去的位置,请你计算出搬运工至少要推动箱子多少格.

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
- #include <cstdio>
- #include <queue>
- using namespace std;
- const int dir[][] = {,,,-,,,-,};
- int m, n, map[][];
- struct node
- {
- int x, y, step;
- int man_x, man_y;
- bool check(void)
- {
- if(x>= && x<m && y>= && y<n)
- {
- if(map[x][y] != )
- {
- return true;
- }
- }
- return false;
- }
- }start, man, temp, next, u, v;
- bool BFS_Man(void)
- {
- start.x = temp.man_x;
- start.y = temp.man_y;
- int mark[][] = {};
- mark[start.x][start.y] = ;
- queue<node>que;
- que.push(start);
- while(!que.empty())
- {
- u = que.front();
- que.pop();
- if(u.x == man.x && u.y == man.y)
- {
- return true;
- }
- for(int i=;i<;i++)
- {
- v.x = u.x + dir[i][];
- v.y = u.y + dir[i][];
- if(v.check() && !mark[v.x][v.y] && (v.x != temp.x || v.y != temp.y)) //越界,撞墙,重复,撞箱子
- {
- mark[v.x][v.y] = ;
- que.push(v);
- }
- }
- }
- return false;
- }
- int BFS_Box(void)
- {
- int mark[][][] = {}; //判重的时候需要一个三维数组,箱子从不同方向过来,人的位置是不一样的,也就意味着状态不一样
- queue<node>que;
- que.push(start);
- while(!que.empty())
- {
- temp = que.front();
- que.pop();
- if(map[temp.x][temp.y] == ) //找到返回步数
- {
- return temp.step;
- }
- for(int i=;i<;i++)
- {
- next.x = temp.x + dir[i][];
- next.y = temp.y + dir[i][];
- next.step = temp.step + ;
- if(next.check() && mark[next.x][next.y][i] == ) //判断越界,撞墙,重复
- {
- man.x = temp.x - dir[i][];
- man.y = temp.y - dir[i][]; //人移动的目标坐标
- if(man.check()) //判断目标坐标是否越界,撞墙
- {
- if(BFS_Man()) //搜索判断人是否可以移动到目标点
- {
- next.man_x = temp.x;
- next.man_y = temp.y; //更新当前人坐标
- mark[next.x][next.y][i] = ;
- que.push(next);
- }
- }
- }
- }
- }
- return -;
- }
- int main()
- {
- int T;
- scanf("%d",&T);
- while(T--)
- {
- scanf("%d%d",&m,&n);
- for(int i=;i<m;i++)
- {
- for(int j=;j<n;j++)
- {
- scanf("%d",&map[i][j]);
- if(map[i][j] == ) //记录箱子起点
- {
- start.x = i;
- start.y = j;
- start.step = ;
- }
- else if(map[i][j] == ) //记录人起点
- {
- start.man_x = i;
- start.man_y = j;
- }
- }
- }
- printf("%d\n",BFS_Box());
- }
- return ;
- }
HDU_1254——推箱子,两次BFS的更多相关文章
- 推箱子 (hdu1254)(bfs双重广搜)
推箱子 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission ...
- hdu 1254 推箱子(双重bfs)
题目链接 Problem Description 推箱子是一个很经典的游戏.今天我们来玩一个简单版本.在一个M*N的房间里有一个箱子和一个搬运工,搬运工的工作就是把箱子推到指定的位置,注意,搬运工只能 ...
- 推箱子 HDU1254 (bfs)
较难的bfs 有两种方法做 一种双重bfs: 主bfs是箱子 还要通过dfs判断人是否能到箱子后面 用inmap函数的好处.. 箱子要用三位数组来标记 因为箱子可以回到原来到过的地方 因为推的 ...
- hdu_1254_推箱子(双BFS)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1254 题解:以箱子为主体,第一层BFS,然后用第二层BFS来判断人是否可以到达,这里细节比较多,要注意 ...
- poj 1475 Pushing Boxes 推箱子(双bfs)
题目链接:http://poj.org/problem?id=1475 一组测试数据: 7 3 ### .T. .S. #B# ... ... ... 结果: //解题思路:先判断盒子的四周是不是有空 ...
- 【GDOI2015】 推箱子 状态压缩+bfs
请注意$8$是一个美妙的数字 考虑到$8\times 8=64$,而一个unsigned long long是$64$位的,所以考虑用一个$01$状态存储箱子.考虑到箱子能转动,那么四种情况都存一下就 ...
- hdu 1254(两个BFS) 推箱子
http://acm.hdu.edu.cn/showproblem.php?pid=1254 首先,要判断人是不是可以从4到达箱子的位置2,而且不止判断一次,因为推动箱子一步后,人的位置也会改变,所以 ...
- hdu.1254.推箱子(bfs + 优先队列)
推箱子 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submis ...
- HDU 1254 推箱子 BFS
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1254 题目分析: 做这道题,感觉挺简单的,做着做着就错了20次, 我也是醉了, WA到吐的节奏啊! 思 ...
随机推荐
- Redis的AOF功能
引言: Redis是基于内存的数据库,同时也提供了若干持久化的方案,允许用户把内存中的数据,写入本地文件系统,以备下次重启或者当机之后继续使用.本文将描述如何基于Redis来设置AOF功能 什么是R ...
- CSS从大图中抠取小图完整教程(background-position应用) (转)
自认为把background-position的应用讲得非常通俗易懂的教材.做个记号. 相信很多喜欢研究网页界面的童鞋都遇到过一个奇妙的现象:网页中很多图片素材被合成在一张图片上. 起初小菜模仿网站的 ...
- 正则表达式匹配(python)
获取图片的python代码 #coding=utf-8 import urllib import re def getHtml(url): page = urllib.urlopen(url) htm ...
- webconfig的设置节点几个说明
有助于深入理解webconfig <?xml version="1.0" encoding="utf-8" ?> <configuration ...
- 黑马程序员-for和foreach
class Program { static void Main(string[] args) { Console.WriteLine("***第一种情况****************** ...
- EXPDP IMPDP 知识总结
Data Pump Export ATTACH Default: job currently in the user's schema, if there is only one Purpose(目的 ...
- 【转】UITextView 修改键盘 的return按钮
原文:http://www.apkbus.com/blog-107838-45740.html 1 #import <UIKit/UIKit.h>2 3 @interface TextVi ...
- Cocos2dx 3.2 节点之间相互通信与设置触摸吞噬的方法
实际开发中,我们经常会遇到这样的情况.我们有一个层layer1,这个层包含一个menu层,menu1层里又包含了一个节点按钮button1.现在需要实现一个效果:点击button1弹出一个对话框,这个 ...
- I/O复用-select模型
IO复用: I/O复用使得程序可以同时监听多个文件描述符,这对提高程序的性能至关重要.例如TCP服务器要同时处理监听socket和连接socket,客户端要同时处理用户输入和网络连接. Linux下实 ...
- 为什么struts2 ajax 方法执行两次
struts2中使用json插件执行ajax处理时,如果方法名是get方法的时候,方法会莫名其妙的执行两次. 原因: struts2 中JSON的原理是在ACTION中的get方法都会序列化,所以前面 ...