HDU 1254 推箱子(BFS)
Problem Description
现在给定房间的结构,箱子的位置,搬运工的位置和箱子要被推去的位置,请你计算出搬运工至少要推动箱子多少格.

Input
Output
Sample Input
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
Sample Output
4
Author
思路;
1.由于求的是箱子的路径,则通过bfs去找箱子的最短路径
2.由于是人推箱子,所以在找箱子的路径是,需要通过bfs去判断人能否推箱子到那个路径上。
要点(嵌套bfs)
bfs_box时,需注意:是否在界内,是否不为墙,是否人能到推它的相应位置,判重(判断人是否已经在这里推过箱子了,防止TLE)
bfs_per时,需注意:是否在界内,是否不为墙,判重(人是否已经走过这)
#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
int room[][];//房间布置
int n,m,res;//行、列 ,res为最终结果
struct node
{
int x,y,step;//x,y为坐标,step指箱子走过的路
}per,fin,box;//分别指人,终点,以及箱子
bool pvis[][];//人能到的位置
bool pbvis[][][][];//判重
int rx[]={,,,-};
int ry[]={,-,,};
void bfs_per()//找出人当前可以走的位置
{
queue<node>qper;
memset(pvis,false,sizeof(pvis));
qper.push(per);
node cur,next;
while(!qper.empty())
{
cur=qper.front();
qper.pop();
pvis[cur.x][cur.y]=true;
for(int i=;i<;i++)
{
next.x=cur.x+rx[i];
next.y=cur.y+ry[i];
if(next.x>=&&next.x<n&&next.y>=&&next.y<m)//在界内
if(room[next.x][next.y]==)//可走
if(!pvis[next.x][next.y])
qper.push(next);
}
}
}
void bfs_box()//找出箱子可移动的最短路径
{
queue<node>qbox;
qbox.push(box);
qbox.push(per);
node cur,next;
while(!qbox.empty())
{
cur=qbox.front();//box所在位置
qbox.pop();
per=qbox.front();//人的位置
qbox.pop();
if(cur.x==fin.x&&cur.y==fin.y)
{
if(res==-||cur.step<res)
res=cur.step;
return ;
}
pbvis[cur.x][cur.y][per.x][per.y]=true;
room[cur.x][cur.y]=;//箱子人是不能走的
bfs_per();//人可以到达的位置
room[cur.x][cur.y]=;//回溯
for(int i=;i<;i++)
{
next.x=cur.x+rx[i];
next.y=cur.y+ry[i];
next.step=cur.step+;
if(next.x>=&&next.x<n&&next.y>=&&next.y<m) //在界内
if(room[next.x][next.y]==)//箱子位置可达
if(pvis[cur.x-rx[i]][cur.y-ry[i]])//人能到箱子的反方向
if(!pbvis[next.x][next.y][cur.x][cur.y])//判重防止TLE
{
qbox.push(next);//箱子当前的位置
qbox.push(cur);// 人当前的位置
}
}
}
}
int main()
{
int T;
cin>>T;
while(T--)
{
cin>>n>>m;
for(int i=;i<n;i++)
for(int j=;j<m;j++)
{
cin>>room[i][j];
if(room[i][j]==)
box.x=i,box.y=j,box.step=;//初始化
else if(room[i][j]==)
fin.x=i,fin.y=j,room[i][j]=;//处理成可以走的地方
else if(room[i][j]==)
per.x=i,per.y=j,room[i][j]=;
}
res=-;
memset(pbvis,false,sizeof(pbvis));//都没有访问过
bfs_box();
printf("%d\n",res);
}
return ;
}
HDU 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)
题目链接 Problem Description 推箱子是一个很经典的游戏.今天我们来玩一个简单版本.在一个M*N的房间里有一个箱子和一个搬运工,搬运工的工作就是把箱子推到指定的位置,注意,搬运工只能 ...
- hdu 1254 推箱子(嵌套搜索,bfs中有dfs)
推箱子 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...
- hdu 1254 推箱子(搜索)
我写的第一道感觉比较难的搜索 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1254 首先要推箱子的话要满足人能够在箱子旁边,而且人的对面也是可通的. ...
- [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 一开始常规的人用来做主导,想着想着不对劲,其实是箱子为主导,人只是箱子能否推进的一个判断. 可以 ...
随机推荐
- SqlServer和Oracle判断表和列是否存在
SqlServer .判断表Users是否存在 if object_id(N'Users',N'U') is not null print '存在' else print '不存在' .判断表User ...
- 你的centos/linux下有多个php.ini,不确定是哪个时
你的centos/linux下有多个php.ini,不确定是哪个时,但是你自己知道,你的php安装目录. 比如我的php安装目录是 /usr/local/php 那么可以通过命令来查找php.ini的 ...
- wpf里窗体嵌入winform控件被覆盖问题
问题1:嵌套Winform控件(ZedGraph)在WPF的ScrollViewer控件上,出现滚动条,无论如何设置该Winform控件都在顶层,滚动滚动条会覆盖其他WPF控件. 解决办法:在Sc ...
- LeetCode--119--杨辉三角II
问题描述: 给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行. 在杨辉三角中,每个数是它左上方和右上方的数的和. 示例: 输入: 3 输出: [1,3,3,1] 进阶: 你可以优化你 ...
- LeetCode--058--最后一个单词的长度
问题描述 给定一个仅包含大小写字母和空格 ' ' 的字符串,返回其最后一个单词的长度. 如果不存在最后一个单词,请返回 0 . 说明:一个单词是指由字母组成,但不包含任何空格的字符串. 示例: 输入: ...
- Tomcat报错Exception: java.lang.OutOfMemoryError
进入Tomcat中的/bin/catalina.sh 在catalina.sh中echo"Using CATALINA_BASE"之前的一行添加如下代码: JAVA_OPTS=&q ...
- 『TensorFlow』通过代码理解gan网络_中
『cs231n』通过代码理解gan网络&tensorflow共享变量机制_上 上篇是一个尝试生成minist手写体数据的简单GAN网络,之前有介绍过,图片维度是28*28*1,生成器的上采样使 ...
- python-day33--互斥锁
锁的意思就是:一个一个的执行 from multiprocessing import Process,Lock import os import time def work(mutex): mutex ...
- 在EO中获取某字段基于表的列名
//生成EO的时候自动生成的字段 public static final int BRIEFINTRO = 88; String[][] str = null; str = new String[][ ...
- synchronized锁普通方法和锁静态方法
1.对象锁钥匙只能有一把才能互斥,才能保证共享变量的唯一性 2.在静态方法上的锁,和 实例方法上的锁,默认不是同样的,如果同步需要制定两把锁一样. 3.关于同一个类的方法上的锁,来自于调用该方法的对象 ...