推箱子 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. Python练习题–持续更新

    1.你是一个高级测试工程师,现在要做性能测试,需要你写一个函数,批量生成一些注册使用的账号. 产生的账号是以@163.com结尾,长度由用户输入,产生多少条也由用户输入,用户名不能重复,用户名必须由大 ...

  2. 虚拟机centos 里tomcat的端口映射到主机 Windows里面

  3. HDU - 5584 LCM Walk (数论 GCD)

    A frog has just learned some number theory, and can't wait to show his ability to his girlfriend. No ...

  4. 制作ubuntu U盘安装盘

    sudo dd if=ubuntu.iso of=/dev/sdb2 sudo syslinux /dev/sdb1

  5. [CSS3] Identify Interactive HTML Elements with CSS Link Pseudo Classes

    The interactive pseudo-classes for links (and buttons) allow us to make sure the user knows what ele ...

  6. 手机加载优化 - 2x、3x图

    人们常说,现在的流量不值钱了,图越大越好咯! 我想说的是,浏览器虽然不值钱了,但速度还是略快吧! 文章来自:UI妹儿 icon_alipay.png→iPhone 1-3代的手机(已经不考虑了) ic ...

  7. 翻翻git之---&quot;有趣效果&quot;的自己定义View EasyArcLoading

    转载请注明出处:王亟亟的大牛之路 早上写了一个关于MD的文章,下午给编译器调了个色,感觉要上天了.所以为了试颜色就出了这篇文章,让大家一起瞎一下 好了废话不说.这一片给大家介绍一个当做Dialog作用 ...

  8. LZMA C# SDK 结合 UPK 打包压缩 多目录 Unity3d实例

    上篇  LZMA C# SDK 子线程压缩与解压缩 Unity3d实例  讲了怎样使用 LZMA C# SDK 来对文件进行压缩与解压,当中提到 对于多目录能够先打包成 UPK 然后再 LZMA 压缩 ...

  9. POJ 2378 Tree Cutting 子树统计

    题目大意:给出一棵树.将树中的一个节点去掉之后,这棵树会分裂成一些联通块.求去掉哪些点之后.全部联通块的大小不超过全部节点的一半.并按顺序输出. 思路:基础的子树统计问题,仅仅要深搜一遍就能够出解.这 ...

  10. Tomcat配置,Myeclipse破解和各种设置

    转自:http://www.cnblogs.com/tyjsjl/archive/2006/11/14/2156111.html 根据tomcat来配置eclipse和MyEclipse结合使用起来, ...