推箱子 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. 数学知识巧学JCF(Java Collections framework)

    不知你是否还记得高中我们学过的集合,映射,函数,数学确实很牛逼,拿它来研究java集合类,轻而易举的就把知识理解了.本篇文章适合初学java集合类的小白,也适合补充知识漏缺的学习者,同时也是面试者可以 ...

  2. 洛谷——P3576 [POI2014]MRO-Ant colony

    P3576 [POI2014]MRO-Ant colony 题目描述 The ants are scavenging an abandoned ant hill in search of food. ...

  3. ansible、zabbix、tcpdump

    Ansible 源码安装 https://blog.csdn.net/williamfan21c/article/details/53439307 Ansible安装过程中常遇到的错误 http:// ...

  4. css可见性

    overflow:hidden:       溢出隐藏 visibility:hidden:        隐藏元素,隐藏之后还占据原来的位置 display:none:            隐藏元 ...

  5. 阿里云***(java应用)

    阿里云***(FQ)实战 前言 ​ 因为公司涉及国外业务,依赖于google的map服务,生产环境我们使用的是亚马逊服务器,所以访问google地图没问题,但是国内的开发.测试环境,使用的是阿里云,想 ...

  6. 【Android开发—智能家居系列】(一):智能家居原理

    来到JCZB公司的第二天,就接到了开发类似于小米智能家庭APP的任务.组长让我在手机上安装上此款APP,给了我个小米智能插座,就让我开始了解需求.这便开启了我的智能家居旅程.说实话,我也真是out的无 ...

  7. xgboost原理及并行实现

    XGBoost训练: It is not easy to train all the trees at once. Instead, we use an additive strategy: fix ...

  8. BUPT复试专题—统计时间间隔(2013计院)

    题目描述 给出两个时间(24小时制),求第一个时间至少要经过多久才能到达第二个时间.给出的时间一定满足的形式,其中x和y分别代表小时和分钟.0≤x<24,0≤y<60. 输入格式 第一行为 ...

  9. Centos7配置Grafana对接OpenLDAP

    在grafana的主配置文件grafana.ini中开启LDAP认证 注意:grafana有两个地方需要指定(/etc/grafana/grafana.ini和/usr/share/grafana/c ...

  10. PostgreSQL触发器的使用

    原文: https://www.yiibai.com/postgresql/postgresql-trigger.html -------------------------------------- ...