hdu 1254 推箱子(嵌套搜索,bfs中有dfs)
推箱子
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 6416 Accepted Submission(s):
1834
现在给定房间的结构,箱子的位置,搬运工的位置和箱子要被推去的位置,请你计算出搬运工至少要推动箱子多少格.
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- #include <queue>
- using namespace std;
- struct node
- {
- int x,y; //箱子的位置
- int xx,xy; //人的位置
- int t; //箱子动的格数
- } s1,s2;
- int f[][]= {,,,-,,,-,}; //方向变量
- int map[][]; //记录地图
- int vis[][][][]; //四维数组标记,同时记录箱子的位置和人的位置,去除重复的
- int n,m; //边界
- int a1,a2,b1,b2; //初始值
- int flag[][],kk;
- bool xx(int a,int b)
- {
- if(a>=&&a<n&&b>=&&b<m&&map[a][b]!=) return true;
- return false;
- }
- void DFS(int nx,int ny,int mx,int my)
- {
- if(nx==mx&&ny==my) //如果从要到的点能搜到此时人的位置,则人可以走过来
- {
- kk=; //若能走来,标记为1
- return;
- }
- for(int i=; i<&&!kk; i++)
- {
- int x=nx+f[i][];
- int y=ny+f[i][];
- if(xx(x,y)&&!flag[x][y])
- {
- flag[x][y]=; //走过的点标记为1
- DFS(x,y,mx,my); //继续搜索
- }
- }
- }
- void BFS()
- {
- queue<node> q;
- while(!q.empty())
- q.pop();
- int nx,ny;
- s1.x=a1; //初始化
- s1.y=b1;
- s1.xx=a2;
- s1.xy=b2;
- s1.t=;
- vis[a1][b1][a2][b2]=; //开始状态标记为已出现
- q.push(s1);
- while(!q.empty())
- {
- s1=q.front();
- q.pop();
- if(map[s1.x][s1.y]==) //箱子到达指定位置后,队列循环结束
- {
- printf("%d\n",s1.t);
- return;
- }
- for(int i=; i<; i++)
- {
- s2.x=s1.x+f[i][]; //箱子移动后的位置
- s2.y=s1.y+f[i][];
- nx=s1.x-f[i][]; //如果箱子能移动到那个位置,人必须能走到这个点
- ny=s1.y-f[i][];
- if(xx(s2.x,s2.y)&&xx(nx,ny)&&!vis[s2.x][s2.y][nx][ny])
- //xx()函数判断是否超边界和是否是墙,箱子移动后的位置和人要到的位置都必须满足,并且此时这个状态是没有出现过的
- {
- memset(flag,,sizeof(flag)); //地图中所有不是墙的点都能走
- flag[nx][ny]=flag[s1.x][s1.y]=; //箱子移动前的位置和人要到的位置都看做墙
- kk=; //标记人是否能走过来
- DFS(nx,ny,s1.xx,s1.xy); //深搜查询
- if(kk) //如果人能走到
- {
- vis[s2.x][s2.y][nx][ny]=; //这个状态标记已出现
- s2.xx=nx; //记录此时人到的位置
- s2.xy=ny;
- s2.t=s1.t+; //步数加一
- q.push(s2); //入队列
- }
- }
- }
- }
- printf("-1\n"); //如果不能到,则输出-1
- return;
- }
- int main()
- {
- int T,i,j;
- scanf("%d",&T);
- while(T--)
- {
- scanf("%d%d",&n,&m);
- memset(vis,,sizeof(vis)); //标记全部初始化为0
- for(i=; i<n; i++)
- for(j=; j<m; j++)
- {
- scanf("%d",&map[i][j]);
- if(map[i][j]==) //记录箱子的起始位置
- {
- a1=i;
- b1=j;
- }
- if(map[i][j]==) //记录人的起始位置
- {
- a2=i;
- b2=j;
- }
- }
- BFS();
- }
- return ;
- }
hdu 1254 推箱子(嵌套搜索,bfs中有dfs)的更多相关文章
- hdu 1254 推箱子(搜索)
我写的第一道感觉比较难的搜索 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1254 首先要推箱子的话要满足人能够在箱子旁边,而且人的对面也是可通的. ...
- hdu 1254 推箱子(双重bfs)
题目链接 Problem Description 推箱子是一个很经典的游戏.今天我们来玩一个简单版本.在一个M*N的房间里有一个箱子和一个搬运工,搬运工的工作就是把箱子推到指定的位置,注意,搬运工只能 ...
- HDU 1254 推箱子(BFS加优先队列)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1254 推箱子 Time Limit: 2000/1000 MS (Java/Others) Me ...
- HDU 1254 推箱子 BFS
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1254 题目分析: 做这道题,感觉挺简单的,做着做着就错了20次, 我也是醉了, WA到吐的节奏啊! 思 ...
- hdu - 1254 推箱子 (bfs+bfs)
http://acm.hdu.edu.cn/showproblem.php?pid=1254 题目意思很简单,只要思路对就好. 首先考虑搬运工能否到达推箱子的那个点,这个可以根据箱子前进方向得出搬运工 ...
- HDU 1254 推箱子(BFS)
Problem Description 推箱子是一个很经典的游戏.今天我们来玩一个简单版本.在一个M*N的房间里有一个箱子和一个搬运工,搬运工的工作就是把箱子推到指定的位置,注意,搬运工只能推箱子而不 ...
- hdu.1254.推箱子(bfs + 优先队列)
推箱子 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submis ...
- [HDU 1254] 推箱子
推箱子 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submis ...
- HDU 1254 推箱子游戏(搞了一下午。。。)
中文题目:http://acm.hdu.edu.cn/showproblem.php?pid=1254 一开始常规的人用来做主导,想着想着不对劲,其实是箱子为主导,人只是箱子能否推进的一个判断. 可以 ...
随机推荐
- Sql server定时执行某个sql 通过Windows 计划任务(非代理Job方式)
建立 bat文件.内容如下: osql -s "xxx.xxx.xx.x" -U sa -P sa -d DB -i TruncateSql.sql osql -S "l ...
- 深入探索WebSockets
WebSockets简介 在2008年中期,开发人员Michael Carter和Ian Hickson特别敏锐地感受到Comet在实施任何真正强大的东西时所带来的痛苦和局限. 通过在IRC和W3C邮 ...
- navgator 用于浏览器检测
- Spring4.x 基础知识点
# Spring4.x 基础知识点## 第二章 快速入门- 一般情况下,需要在业务模块包下进一步按分层模块划分子包,如user\dao.user\service.viewspace\dao.views ...
- goland的下载安装破解并配置
1.下载地址:https://www.jetbrains.com/go/ 2.安装:简单 3.破解:https://www.cnblogs.com/igoodful/p/9113946.html 4. ...
- 几道莫名AC的并查集题
那啥那啥 原本今天还是做(看)差分约束的,但是上不去Vjudge我只能来刷并查集了. %%%静萱大佬把那么多年的noip题都刷遍了,我只能刷水题,noip的题实在是太难了不会啊. 第一道:洛谷P202 ...
- idea 项目热部署设置
1.引入pom.xml() <!-- 热部署(必须) --> <dependency> <groupId>org.springframework.boot</ ...
- 【JZOJ4877】【NOIP2016提高A组集训第10场11.8】力场护盾
题目描述 ZMiG成功粉碎了707的基因突变计划,为了人类的安全,他决定向707的科学实验室发起进攻!707并没有想到有人敢攻击她的实验室,一时间不知所措,决定牺牲电力来换取自己实验室的平安. 在实验 ...
- request header....
root@xxx# curl -i --get --include 'http://ali-barcode.showapi.com/barcode?code=6938166920785' -H 'Au ...
- 实现一个简易的promise
//promise里面只有三个状态,且三个状态的转换形式有两种 //由pending转换为fulfilled,由pending转换为rejected //Promise的构造函数参数是一个函数,函数的 ...