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个方向移动,但是不能移动出地图 ...
随机推荐
- spring Boot 不认Mapper.xml
很久以前的笔记了,大约就是用Generatro工具自动生成代码的时候,springboot找不到mapper.xml 之前,由于用mybatis-generator自动生成了entity,dao,ma ...
- 前端跳转处理--房天下的访问页面部分ip自动跳转到登录页面的解决办法(xjl456852原创)
朋友说自己在访问房天下的页面时,他们页面进行了跳转,跳转到登录页面,说是前端跳转.让我也看看,我看我的机器没有进行跳转. 后来就发现有的机器在访问页面会自动跳转到登录页面.有的不会进行跳转. 比如访问 ...
- 关于Filter中ServletRequest和ServletResponse强转HttpServletRequest和HttpServletResponse安全问题(向下转型一定不安全吗?)
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOE ...
- jquery如何通过ajax请求获取后台数据显示在表格上
1.引入bootstrap和jquery的cdn <link rel="stylesheet" type="text/css" href="ht ...
- next_permitation
了解一个C++ STL的函数 next_permitation 可用于生成全排列 如下例子 #include <iostream> #include <stdio.h> #in ...
- hiho一下 第四十九周 欧拉路
http://hihocoder.com/contest/hiho49/problem/1 给定无孤立结点图G,若存在一条路,经过图中每边一次且仅一次,该条路称为欧拉路. 一个无向图存在欧拉路当且仅当 ...
- cogs——7. 通信线路
7. 通信线路 ★★ 输入文件:mcst.in 输出文件:mcst.out 简单对比时间限制:1.5 s 内存限制:128 MB 问题描述 假设要在n个城市之间建立通信联络网,则连通n ...
- MySQL JDBC URL参数(转)
MySQL的 JDBC URL格式: jdbc:mysql://[host][,failoverhost...][:port]/[database] » [?propertyName1][=prope ...
- Vue.js父子通信之所有方法和数据共享
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- mysql你确定掌握的那些sql语句
1.创建表 create table test(uid int not null,create_time timestamp default current_timestamp); 即:没有双引号,单 ...