hdoj--1254--推箱子(bfs好题)
推箱子
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 6758 Accepted Submission(s): 1906
现在给定房间的结构,箱子的位置,搬运工的位置和箱子要被推去的位置,请你计算出搬运工至少要推动箱子多少格.

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
4
#include<stdio.h>
#include<cstring>
#include<queue>
#include<iostream>
#include<algorithm>
using namespace std;
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
int map[10][10],mark[10][10][10][10];
int n,m,flag,markk[10][10];
int xiangx,xiangy;
struct dian
{
int x,y;
int renx,reny;
int step;
}st,end;
struct ren
{
int x,y;
}vv,stt;
int bffs(ren stt)
{
queue<ren>q;
markk[stt.x][stt.y]=1;
q.push(stt);
ren v,vn;
while(!q.empty())
{
vn=q.front();
q.pop();
if(vn.x==vv.x&&vn.y==vv.y)
return 1;//可以到达现在推箱子的位置
for(int i=0;i<4;i++)
{
v.x=vn.x+dx[i];
v.y=vn.y+dy[i];
if(v.x>=n||v.x<0||v.y>=m||v.y<0)
continue;//不能出界
if(map[v.x][v.y]==1) continue;
if(v.x==xiangx&&v.y==xiangy) continue;
//不能在以前箱子所在的位置
if(markk[v.x][v.y]) continue;
markk[v.x][v.y]=1;
q.push(v);
}
}
return 0;
}
void bfs(dian st)
{
queue<dian>p;
p.push(st);//使用人还有箱子的位置实现四维标记
mark[st.x][st.y][st.renx][st.reny]=1;
dian v,vn;
while(!p.empty())
{
vn=p.front();
p.pop();
if(vn.x==end.x&&vn.y==end.y)
{//如果现在箱子被推到了指定的位置
flag=1;
printf("%d\n",vn.step);
return;
}
for(int i=0;i<4;i++)
{//箱子位置变更
v.x=vn.x+dx[i];
v.y=vn.y+dy[i];
v.step=vn.step+1;
v.renx=vn.x;
v.reny=vn.y;
vv.x=vn.x-dx[i];//vv中的x,y存储了推箱子时人应该在的位置
vv.y=vn.y-dy[i];
if(v.x>=n||v.x<0||v.y>=m||v.y<0) continue;
if(map[v.x][v.y]==1) continue;
if(map[vv.x][vv.y]==1||vv.x>=n||vv.x<0||vv.y>=m||vv.y<0) continue;
if(mark[v.x][v.y][v.renx][v.reny]) continue;
stt.x=vn.renx;//结构体中存放的有当时人的位置
stt.y=vn.reny;
xiangx=vn.x;
xiangy=vn.y;
memset(markk,0,sizeof(markk));
if(!bffs(stt)) continue;//箱子被推之前的位置,因为还要判定是否可以推
mark[v.x][v.y][v.renx][v.reny]=1;
p.push(v);
}
}
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
flag=0;
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
scanf("%d",&map[i][j]);
if(map[i][j]==2)
{
st.x=i;
st.y=j;
xiangx=i;
xiangy=j;
}
if(map[i][j]==3)
{
end.x=i;
end.y=j;
}
if(map[i][j]==4)
{
st.renx=i;
st.reny=j;
}
}
st.step=0;
memset(mark,0,sizeof(mark));
memset(markk,0,sizeof(markk));
bfs(st);
if(!flag) printf("-1\n");
}
return 0;
}
hdoj--1254--推箱子(bfs好题)的更多相关文章
- 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 + 优先队列)
推箱子 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 推箱子 Time Limit: 2000/1000 MS (Java/Others) Me ...
- hdu 1254 推箱子(嵌套搜索,bfs中有dfs)
推箱子 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...
- HDU 1254 推箱子(BFS)
Problem Description 推箱子是一个很经典的游戏.今天我们来玩一个简单版本.在一个M*N的房间里有一个箱子和一个搬运工,搬运工的工作就是把箱子推到指定的位置,注意,搬运工只能推箱子而不 ...
- hdu 1254 推箱子(双重bfs)
题目链接 Problem Description 推箱子是一个很经典的游戏.今天我们来玩一个简单版本.在一个M*N的房间里有一个箱子和一个搬运工,搬运工的工作就是把箱子推到指定的位置,注意,搬运工只能 ...
- [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 首先要推箱子的话要满足人能够在箱子旁边,而且人的对面也是可通的. ...
- 推箱子 BFS
[编程题] 推箱子 大家一定玩过“推箱子”这个经典的游戏.具体规则就是在一个N*M的地图上,有1个玩家.1个箱子.1个目的地以及若干障碍,其余是空地.玩家可以往上下左右4个方向移动,但是不能移动出地图 ...
随机推荐
- 源码学习-Object类
1.Object类是Java所有类的超类 2.查看Object的属性和方法,发现Object类没有属性,只有13个方法,其中7个本地方法. 3.接下来看具体的方法 3.1 Object() 默认的构造 ...
- 24L01-2.4G无线传输模块调节记录
在调试24L01的时候,虽然能用到别人的程序,但仅仅是程序的初始化,并没有告诉我们如何去后续的操作,如何去再次发送一组数.最近调试24L01接近尾声,将逐一的地方总结下来,以便以后查阅,也供其他人借鉴 ...
- Unity3D 固定功能函数
Unity 3D 测试固定功能函数执行顺序 1. 在GameObject和脚本激活状态下,测试: 2. 在GameObject激活状态下,测试: 3. 在2种情况都不激活的状态下测试:脚本无输出: 函 ...
- Python之条件 循环和其他语句 2014-4-6
#条件 循环和其他语句 23:30pm-1:431.print和import的更多信息 使用逗号将多个表达式输出 >>> print 'age:',42 age: 42 >&g ...
- Codeforces Round #259 (Div. 2) D
D. Little Pony and Harmony Chest time limit per test 4 seconds memory limit per test 256 megabytes i ...
- hdu 4435 bfs+贪心
/* 题意:给定每个点在平面内的坐标,要求选出一些点,在这些点建立加油站,使得总花费最少(1号点必须建立加油站).在i点建立加油站需要花费2^i. 建立加油站要求能使得汽车从1点开始走遍全图所有的点并 ...
- Mysql UPDATE 操作时含 Limit 注意事项
在update时,可以使用limit来设置,更新的条数,但下面这句sql语句是错误的. LIMIT ,; //错误提示:ERROR 1064 (42000): You have an error in ...
- 【git】Git 提示fatal: remote origin already exists 错误解决办法
今天使用git 添加远程github仓库的时候提示错误:fatal: remote origin already exists. 最后找到解决办法如下: 1.先删除远程 Git 仓库 $ git re ...
- 创建Django项目(二)——数据库配置
2013-08-05 20:53:44| 1.数据库配置 举例是用MySQL数据库,首先在settings文件中做配置,如下: DATABASES = { ' ...
- hadoop(1)入门
hadoop入门(一) 一.概述 1.什么是hadoop hadoop不仅是一个用于存储分布式文件系统,还是设计用来在有通用计算设备组成的大型集群上执行的分布式应用的基础框架. hadoop框架最 ...