HDU 1254 推箱子 (BFS套BFS)
2016-06-09 10:57
441 查看
推箱子
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 7052 Accepted Submission(s): 2008
[align=left]Problem Description[/align]
推箱子是一个很经典的游戏.今天我们来玩一个简单版本.在一个M*N的房间里有一个箱子和一个搬运工,搬运工的工作就是把箱子推到指定的位置,注意,搬运工只能推箱子而不能拉箱子,因此如果箱子被推到一个角上(如图2)那么箱子就不能再被移动了,如果箱子被推到一面墙上,那么箱子只能沿着墙移动.
现在给定房间的结构,箱子的位置,搬运工的位置和箱子要被推去的位置,请你计算出搬运工至少要推动箱子多少格.
[align=left]Input[/align]
输入数据的第一行是一个整数T(1<=T<=20),代表测试数据的数量.然后是T组测试数据,每组测试数据的第一行是两个正整数M,N(2<=M,N<=7),代表房间的大小,然后是一个M行N列的矩阵,代表房间的布局,其中0代表空的地板,1代表墙,2代表箱子的起始位置,3代表箱子要被推去的位置,4代表搬运工的起始位置.
[align=left]Output[/align]
对于每组测试数据,输出搬运工最少需要推动箱子多少格才能帮箱子推到指定位置,如果不能推到指定位置则输出-1.
[align=left]Sample Input[/align]
1
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
[align=left]Sample Output[/align]
4
[align=left]Author[/align]
Ignatius.L & weigang Lee
[align=left]Recommend[/align]
Ignatius.L | We have carefully selected several similar problems for you: 1372 1429 1728 1195 1401
题意:给你一个图,问你能不能将箱子推到终点,(注意!!)求出最少需要推动箱子多少格才能帮箱子推到指定位置?推箱子时可以往回推,但要判断人能否到达推箱子的位置。
BFS 套 BFS 撸一波。。。。
AC代码:
#include<stdio.h> #include<string.h> #include<queue> #include<iostream> using namespace std; struct node { int x,y,step; int peox,peoy; }a,b; struct Node { int x,y; }p,q; int dir[4][2]={0,1,0,-1,1,0,-1,0}; int map[10][10],n,m; int mark[10][10][10][10]; int judge_bfs(int starx,int stary,int endx,int endy,int tx,int ty) //判断人能否到达 { p.x=starx; p.y=stary; int leap[10][10]; memset(leap,0,sizeof(leap)); leap[p.x][p.y]=1; queue<Node>P; P.push(p); while(!P.empty()) { q=P.front(); P.pop(); if(q.x==endx&&q.y==endy) return 1; for(int i=0;i<4;i++) { p.x=q.x+dir[i][0]; p.y=q.y+dir[i][1]; if(p.x<1||p.x>n||p.y<1||p.y>m) continue; if(p.x==tx&&p.y==ty) continue; if(leap[p.x][p.y]==0&&map[p.x][p.y]!=1) { leap[p.x][p.y]=1; P.push(p); } } } return 0; } int bfs(int starx,int stary,int peox,int peoy) //搜箱子 { int i; a.x=starx; a.y=stary; a.peox=peox; a.peoy=peoy; a.step=0; memset(mark,0,sizeof(mark)); mark[a.x][a.y][a.peox][a.peoy]=1; queue<node>Q; Q.push(a); while(!Q.empty()) { b=Q.front(); Q.pop(); if(map[b.x][b.y]==3) //终点 { return b.step; } for(i=0;i<4;i++) { a.x=b.x+dir[i][0]; a.y=b.y+dir[i][1]; a.step=b.step+1; if(a.x<1||a.x>n||a.y<1||a.y>m) continue; if(map[a.x][a.y]==1) continue; if(mark[a.x][a.y][b.x][b.y]) continue; if(i==0) { if(b.y-1>=1&&map[b.x][b.y-1]!=1&&judge_bfs(b.peox,b.peoy,b.x,b.y-1,b.x,b.y)) { a.peox=b.x; a.peoy=b.y; mark[a.x][a.y][a.peox][a.peoy]=1; Q.push(a); } } else if(i==1) { if(b.y+1<=m&&map[b.x][b.y+1]!=1&&judge_bfs(b.peox,b.peoy,b.x,b.y+1,b.x,b.y)) { a.peox=b.x; a.peoy=b.y; mark[a.x][a.y][a.peox][a.peoy]=1; Q.push(a); } } else if(i==2) { if(b.x-1>=1&&map[b.x-1][b.y]!=1&&judge_bfs(b.peox,b.peoy,b.x-1,b.y,b.x,b.y)) { a.peox=b.x; a.peoy=b.y; mark[a.x][a.y][a.peox][a.peoy]=1; Q.push(a); } } else { if(b.x+1<=n&&map[b.x+1][b.y]!=1&&judge_bfs(b.peox,b.peoy,b.x+1,b.y,b.x,b.y)) { a.peox=b.x; a.peoy=b.y; mark[a.x][a.y][a.peox][a.peoy]=1; Q.push(a); } } } } return 0; } int main() { int i,j,T,starx,stary,peox,peoy; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); for(i=1;i<=n;i++) for(j=1;j<=m;j++) { scanf("%d",&map[i][j]); if(map[i][j]==2) //箱子的起点 { starx=i; stary=j; } if(map[i][j]==4) //人的位置 { peox=i; peoy=j; } } int ans=bfs(starx,stary,peox,peoy); if(!ans) printf("-1\n"); else printf("%d\n",ans); } return 0; }
相关文章推荐
- nmap使用
- 整站开发流程概述
- C++Primer 第3章笔记整理
- hdu 2197 本原串(递推,快速幂取模)
- jq利用 animate和mouseenter 做出一些渐变效果
- NPOI创建doc
- hdu 1250(大整数)
- 【一天一道LeetCode】#86. Partition List
- 【一天一道LeetCode】#86. Partition List
- XPath与lxml_3XPath坐标轴
- Zabbix3.0安装部署最佳实践
- 1B. Spreadsheets【进制转换】
- actionbar以及制定
- 搭建Nginx与tomcat整合,用Nginx代替apache
- Linux环境下字符设备驱动开发入门
- actionbar setDisplayOptions用法详解
- Mysql优化方案二之数据库类型选择及Sql语句优化
- 浅谈HashMap与HashTable
- GBK 编码
- Python函数