hdu - 1254 推箱子 (bfs+bfs)
2015-05-30 20:26
501 查看
http://acm.hdu.edu.cn/showproblem.php?pid=1254
题目意思很简单,只要思路对就好。
首先考虑搬运工能否到达推箱子的那个点,这个可以根据箱子前进方向得出搬运工需要到达的目的地,用另一个bfs判断,然后就类似两个点的bfs那样用一个数组标记状态,
需要注意箱子在边上的情况。
题目意思很简单,只要思路对就好。
首先考虑搬运工能否到达推箱子的那个点,这个可以根据箱子前进方向得出搬运工需要到达的目的地,用另一个bfs判断,然后就类似两个点的bfs那样用一个数组标记状态,
需要注意箱子在边上的情况。
#include<cstdio> #include<cstring> #include<queue> using namespace std; struct point { int x,y,nx,ny,step; }; int n,m; int maze[10][10]; int used[10][10][10][10]; int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}}; bool bfs1(int a,int b,int c,int d,int p,int q) { int mark[10][10]; memset(mark,0,sizeof(mark)); queue<point>que; point s; s.x=a,s.y=b; mark[s.x][s.y]=1; que.push(s); while(!que.empty()) { point e=que.front();que.pop(); //printf("%d %d\n",e.x,e.y); if(e.x==c&&e.y==d) return true; for(int i=0;i<4;i++) { s.x=e.x+dir[i][0]; s.y=e.y+dir[i][1]; if(s.x==p&&s.y==q) continue; //printf("%d %d\n",s.x,s.y); if(s.x>=0&&s.x<n&&s.y>=0&&s.y<m&&maze[s.x][s.y]!=1&&!mark[s.x][s.y]) { mark[s.x][s.y]=1; que.push(s); } } } return false; } void bfs2(int a,int b,int c,int d) { memset(used,0,sizeof(used)); queue<point>que; point s,e; s.x=a,s.y=b,s.nx=c,s.ny=d,s.step=0; que.push(s); used[s.x][s.y][s.nx][s.ny]=1; while(!que.empty()) { e=que.front();que.pop(); //printf("%d %d %d %d %d\n",e.x,e.y,e.nx,e.ny,e.step); if(maze[e.x][e.y]==3) {printf("%d\n",e.step);return;} for(int i=0;i<4;i++) { s.x=e.x+dir[i][0]; s.y=e.y+dir[i][1]; s.nx=e.x; s.ny=e.y; if(s.x<0||s.x>=n||s.y<0||s.y>=m||maze[s.x][s.y]==1||used[s.x][s.y][s.nx][s.ny]) continue; if(i==0) { if(e.x+1>=n||maze[e.x+1][e.y]==1||(bfs1(e.nx,e.ny,e.x+1,e.y,e.x,e.y)==false)) continue; } else if(i==1) { if(e.x-1<0||maze[e.x-1][e.y]==1||(bfs1(e.nx,e.ny,e.x-1,e.y,e.x,e.y)==false)) continue; } else if(i==2) { if(e.y+1>=m||maze[e.x][e.y+1]==1||(bfs1(e.nx,e.ny,e.x,e.y+1,e.x,e.y)==false)) continue; } else if(i==3) { if(e.y-1<0||maze[e.x][e.y-1]==1||bfs1(e.nx,e.ny,e.x,e.y-1,e.x,e.y)==false) continue; } used[s.x][s.y][s.nx][s.ny]=1; s.step=e.step+1; que.push(s); } } printf("-1\n"); } int main() { //freopen("a.txt","r",stdin); int t,a,b,c,d; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); for(int i=0;i<n;i++) for(int j=0;j<m;j++) { scanf("%d",&maze[i][j]); if(maze[i][j]==2) { a=i; b=j; } else if(maze[i][j]==4) { c=i; d=j; } } bfs2(a,b,c,d); } return 0; }
相关文章推荐
- jQuery实现DIV层的收缩展开效果
- Linux软件包安装1
- Android之Activity LaunchMode
- 百度之星初赛1006(计算几何:能包含凸包的最小矩形面积)
- ExecutorService常用方法和newFixedThreadPool创建固定大小的线程池
- 获取win系统hash值的工具
- Leetcode: Binary Tree Right Side View
- OA项目的计划和开发和开发流程
- IDF实验室-简单的js解密
- 5.7.1.1 单体内置对象
- 为mini2440编写的第一个驱动
- 分布式进阶(十一) Docker 常见错误汇总
- STM32自学笔记之串口通信(USART)
- 遇到 /*+ SYS_DL_CURSOR */ 这个hint
- 分布式进阶(十一) Docker 常见错误汇总
- 软件测试 - 接口测试简介
- windows form窗体应用程序,建一个记事本参考代码,重点是打开,保存,另存为
- Intent详解
- 队列(二):顺序存储队列
- House Robber II