推箱子 1  http://acm.hdu.edu.cn/showproblem.php?pid=1254
推箱子 2  http://acm.hzau.edu.cn/problem.php?id=1010
推箱子 3  https://www.bnuoj.com/v3/problem_show.php?pid=33683

一系列搜索的题目

先讲讲第一题,

题目意思:

推箱子是一个很经典的游戏.今天我们来玩一个简单版本.在一个M*N的房间里有一个箱子和一个搬运工,搬运工的工作就是把箱子推到指定的位置,注意,搬运工只能推箱子而不能拉箱子,因此如果箱子被推到一个角上(如图2)那么箱子就不能再被移动了,如果箱子被推到一面墙上,那么箱子只能沿着墙移动.

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

Input
输入数据的第一行是一个整数T(1<=T<=20),代表测试数据的数量.然后是T组测试数据,每组测试数据的第一行是两个正整数M,N(2<=M,N<=7),代表房间的大小,然后是一个M行N列的矩阵,代表房间的布局,其中0代表空的地板,1代表墙,2代表箱子的起始位置,3代表箱子要被推去的位置,4代表搬运工的起始位置.
 
Output
对于每组测试数据,输出搬运工最少需要推动箱子多少格才能帮箱子推到指定位置,如果不能推到指定位置则输出-1.

给一组样例:

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

题目思路:

双广搜,主线按照箱子到终点来搜索,一边搜索一边判断这一步是否可以走?思路挺简单,写起来比较容易吧,给个代码参考,不对还望指出来啊!谢谢了。

 #include <cstdio>
#include <cstring>
#include <cctype>
#include <cmath>
#include <set>
#include <map>
#include <list>
#include <queue>
#include <deque>
#include <stack>
#include <string>
#include <bitset>
#include <vector>
#include <iostream>
#include <algorithm>
#include <stdlib.h> using namespace std;
typedef long long LL;
const int INF=2e9+1e8;
const double eps=0.0000001;
const int MM=; int maze[MM][MM];
bool vis[MM][MM][MM*MM];
int m,n,dir[][]={{,},{,},{-,},{,-}}; // m 行 n 列;
struct node
{
int x,y,step;
int px,py;
};
struct point
{
int x,y;
};
bool is_out(int x,int y)
{
if(x>=&&x<=m&&y>=&&y<=n) return true;
return false;
}
bool is_arrive(int sx,int sy,int ex,int ey,int xx,int yy)
{
queue<point>q;
bool visit[MM][MM];
memset(visit,,sizeof(visit));
visit[sx][sy]=;
point first,second;
first.x=sx,first.y=sy;
q.push(first);
while(!q.empty())
{
first=q.front();
q.pop();
if(first.x==xx&&first.y==yy) continue;
if(first.x==ex&&first.y==ey) return true;
for(int i=; i<; i++)
{
int x=first.x+dir[i][],y=first.y+dir[i][];
if(is_out(x,y)&&maze[x][y]!=&&visit[x][y]==) //
{
visit[x][y]=;
second.x=x,second.y=y;
q.push(second);
}
}
}
return false;
}
int bfs(int sx,int sy,int px,int py)//对箱子进行广搜
{
memset(vis,,sizeof(vis));
vis[sx][sy][MM*px+py]=;
queue<node>q;
node first,second;
first.px=px,first.py=py,first.step=;
first.x=sx,first.y=sy;
q.push(first);
while(!q.empty())
{
first=q.front();
q.pop();
int x=first.x,y=first.y;
int px=first.px,py=first.py;
if(maze[x][y]==) return first.step;
for(int i=; i<; i++)
{
x=first.x+dir[i][],y=first.y+dir[i][];
px=first.x-dir[i][],py=first.y-dir[i][];
if(is_out(px,py)&&is_out(x,y)&&maze[x][y]!=&&maze[px][py]!=)
{
if(vis[x][y][MM*px+py]==&&is_arrive(first.px , first.py , px , py , first.x , first.y))
{
vis[x][y][MM*px+py]=;
second.px=first.x,second.py=first.y;
second.step=first.step+;
second.x=x,second.y=y;
q.push(second);
}
}
}
}
return -;
}
int main()
{
int ncase;
scanf("%d",&ncase);
while(ncase--)
{
int i,j,sx,sy,manx,many;
scanf("%d %d",&m,&n);
for(i=; i<=m; i++)
for(j=; j<=n; j++)
{
scanf("%d",&maze[i][j]);
if(maze[i][j]==) sx=i,sy=j;// 箱子起始位置
if(maze[i][j]==) manx=i,many=j;// 人的气势位置
}
printf("%d\n",bfs(sx,sy,manx,many));
}
return ;
}

推箱子 hdu1254的更多相关文章

  1. 推箱子 (hdu1254)(bfs双重广搜)

    推箱子 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission ...

  2. 推箱子 HDU1254 (bfs)

    较难的bfs 有两种方法做 一种双重bfs: 主bfs是箱子   还要通过dfs判断人是否能到箱子后面 用inmap函数的好处.. 箱子要用三位数组来标记  因为箱子可以回到原来到过的地方  因为推的 ...

  3. HDU1254 推箱子(BFS) 2016-07-24 14:24 86人阅读 评论(0) 收藏

    推箱子 Problem Description 推箱子是一个很经典的游戏.今天我们来玩一个简单版本.在一个M*N的房间里有一个箱子和一个搬运工,搬运工的工作就是把箱子推到指定的位置,注意,搬运工只能推 ...

  4. HDU1254:推箱子(bfs+dfs)

    传送门 题意 给出一副图 0.空地1.墙2.箱子3.目的地4.人所在的位置 问最少几步能将箱子推到目的地 分析 这道题难度略大(菜鸡),首先用vis[bx][by][mx][my]记录当箱子(bx,b ...

  5. OC推箱子

    #include<stdio.h> #include<stdlib.h> int main(void) { char sr;//存储用户输入的指令 //绘制地图 char a[ ...

  6. c语言游戏推箱子

    前两天做了推箱子小游戏,看似简单的一个小游戏背后却 有巨大的秘密,这秘密就是一大堆逻辑. 自从学习了函数过后,的确是解决了很多问题,而且调用很方便,尽管我现在都不是很会调用. 写完一个函数,准备测试一 ...

  7. JavaScript写一个小乌龟推箱子游戏

    推箱子游戏是老游戏了, 网上有各种各样的版本, 说下推箱子游戏的简单实现,以及我找到的一些参考视频和实例: 推箱子游戏的在线DEMO : 打开 如下是效果图: 这个拖箱子游戏做了移动端的适配, 我使用 ...

  8. 用C#制作推箱子小游戏

    思路分析: 一.制作一个地图 二.地图中放置墙.箱子.人.目标等 三.让小人动起来完成推箱子动作 游戏制作: 1.按照上述地图制作一个地图  (12行×13列) 地图可以看做是行和列组成的,即可以看做 ...

  9. hdu.1254.推箱子(bfs + 优先队列)

    推箱子 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submis ...

随机推荐

  1. PXE+Kickstart 自动安装CentOS系统

    PXE (preboot execcute environment) 依赖服务 dhcp tftp file server (yum repository) 准备TFTP服务器  如何配置TFTP服务 ...

  2. Elixir与编辑器安装

    安装 Elixir 每个操作系统的安装说明可以在 elixir-lang.org 网站上 Installing Elixir 部分找到. 安装后你可以很轻松地确认所安装的版本. ~$:elixir - ...

  3. 关于css虚线

    今天遇到几个虚线效果,不能一下子反应过来具体属性. 一.dashed和dotted的区别 首先是dashed和dotted都是指“虚线”,但是两者显示的效果不尽相同. 从字面意思来看, dashed: ...

  4. 单片机C51串口发送、接收寄存器

    所以,发送和接收寄存器可使用同一地址,编写验证程序(发送和接收是独立空间):读取一个数(1)->发送一个数(2)->再读取得1则是独立空间 不知道STM32串口寄存器和C51串口寄存器是否 ...

  5. synchronized初识

    作用域: 1.对象实例内--->People jack = new Jack(); ①此作用域内的synchronized锁 ,可以防止多个线程同时访问这个对象的synchronized方法 ② ...

  6. html页面中拍照和上传照片那些事儿(二)

    本文为原创,转载请注明出处: cnzt       文章:cnzt-p http://www.cnblogs.com/zt-blog/p/6895352.html 本文主要说下iOS上传的照片在安卓机 ...

  7. 基于R-Tree的最近邻查询

    转自基于R-Tree的最近邻查询 BAB(Branch.and.Band)算法是由Nick Roussopoulousnl等人于1995年提出的,是最早的基于R.树的静态最近邻查询算法.该算法使用MI ...

  8. http转成https

     1.在阿里云服务器上购买一个AC证书,将证书下载下来 2.解压放在tomcat目录下,cert文件夹是我自己建的 3.修改tomcat的配置文件上面那个原来是被注掉的放开  把端口改为443,htt ...

  9. SolidEdge 工程图中如何显示彩色工程图

    点击这个按钮,然后更新视图   效果如下图所示,注意如果你的装配图(.dft文件)是单独拷贝出来的,装配图所引用的零件无法追溯到,则无法渲染这些零件,因此无法制作彩色工程图.

  10. android 4.4以上能够实现的沉浸式状态栏效果

    仅仅有android4.4以及以上的版本号才支持状态栏沉浸效果 先把程序执行在4.4下面的手机上,看下效果: 在4.4以上的效果: watermark/2/text/aHR0cDovL2Jsb2cuY ...