推箱子 hdu1254
推箱子 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)那么箱子就不能再被移动了,如果箱子被推到一面墙上,那么箱子只能沿着墙移动.
现在给定房间的结构,箱子的位置,搬运工的位置和箱子要被推去的位置,请你计算出搬运工至少要推动箱子多少格.
给一组样例:
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的更多相关文章
- 推箱子 (hdu1254)(bfs双重广搜)
推箱子 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission ...
- 推箱子 HDU1254 (bfs)
较难的bfs 有两种方法做 一种双重bfs: 主bfs是箱子 还要通过dfs判断人是否能到箱子后面 用inmap函数的好处.. 箱子要用三位数组来标记 因为箱子可以回到原来到过的地方 因为推的 ...
- HDU1254 推箱子(BFS) 2016-07-24 14:24 86人阅读 评论(0) 收藏
推箱子 Problem Description 推箱子是一个很经典的游戏.今天我们来玩一个简单版本.在一个M*N的房间里有一个箱子和一个搬运工,搬运工的工作就是把箱子推到指定的位置,注意,搬运工只能推 ...
- HDU1254:推箱子(bfs+dfs)
传送门 题意 给出一副图 0.空地1.墙2.箱子3.目的地4.人所在的位置 问最少几步能将箱子推到目的地 分析 这道题难度略大(菜鸡),首先用vis[bx][by][mx][my]记录当箱子(bx,b ...
- OC推箱子
#include<stdio.h> #include<stdlib.h> int main(void) { char sr;//存储用户输入的指令 //绘制地图 char a[ ...
- c语言游戏推箱子
前两天做了推箱子小游戏,看似简单的一个小游戏背后却 有巨大的秘密,这秘密就是一大堆逻辑. 自从学习了函数过后,的确是解决了很多问题,而且调用很方便,尽管我现在都不是很会调用. 写完一个函数,准备测试一 ...
- JavaScript写一个小乌龟推箱子游戏
推箱子游戏是老游戏了, 网上有各种各样的版本, 说下推箱子游戏的简单实现,以及我找到的一些参考视频和实例: 推箱子游戏的在线DEMO : 打开 如下是效果图: 这个拖箱子游戏做了移动端的适配, 我使用 ...
- 用C#制作推箱子小游戏
思路分析: 一.制作一个地图 二.地图中放置墙.箱子.人.目标等 三.让小人动起来完成推箱子动作 游戏制作: 1.按照上述地图制作一个地图 (12行×13列) 地图可以看做是行和列组成的,即可以看做 ...
- hdu.1254.推箱子(bfs + 优先队列)
推箱子 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submis ...
随机推荐
- 多线程环境下 cpu % 分析
1. top -H(查看阻塞进程,线程) 2. jstack pid(查看堆栈信息) 另附 利用 Java dump 进行 JVM 故障诊断 http://www.blogjava.net/yuwe ...
- Jmeter中处理json
我们在做http接口测试的时候,返回的数据都是json串,Jmeter中本身是不支持直接处理json串的,如果要获取到返回结果中指定的值,必须要要通过正则表达式来获取到,正则表达式比较麻烦,写错了就获 ...
- .Net Core下使用RabbitMQ比较完备的两种方案(虽然代码有点惨淡,不过我会完善)
一.前言 上篇说给大家来写C#和Java的方案,最近工作也比较忙,迟到了一些,我先给大家补上C#的方案,另外如果没看我上篇博客的人最好看一下,否则你可能看的云里雾里的,这里我就不进行具体的方案 ...
- 《深入理解mybatis原理》 Mybatis初始化机制详解
对于任何框架而言,在使用前都要进行一系列的初始化,MyBatis也不例外.本章将通过以下几点详细介绍MyBatis的初始化过程. 1.MyBatis的初始化做了什么 2. MyBatis基于XML配置 ...
- 虽然今天angular5发布了,但我还是吧这篇angularjs(1)+webpack的文章发出来吧哈哈哈
本文为原创,转载请注明出处: cnzt 文章:cnzt-p http://www.cnblogs.com/zt-blog/p/7779384.html 写在前面: 因为最近总结自己之前做过 ...
- Docker资源限制实现——cgroup
摘要 随着Docker技术被越来越多的个人.企业所接受,其用途也越来越广泛.Docker资源管理包含对CPU.内存.IO等资源的限制,但大部分Docker使用者在使用资源管理接口时往往还比较模糊. 本 ...
- 【hibernate spring data jpa】执行了save()方法 sql语句也执行了,但是数据并未插入数据库中
执行了save()方法 sql语句也执行了,但是数据并未插入数据库中 解决方法: 是因为执行了save()方法,也执行了sql语句,但是因为使用的是 @Transactional 注解,不是手动去提 ...
- 【iOS】系统框架学习
iOS的系统架构分为四个层次:核心操作系统层(Core OS layer).核心服务层(Core Services layer).媒体层(Media layer)和可触摸层(Cocoa Touch l ...
- MySQL和MongoDB的性能测试
软硬件环境 MySQL版本:5.1.50,驱动版本:5.1.6(最新的5.1.13有很多杂七杂八的问题) MongoDB版本:1.6.2,驱动版本:2.1 操作系统:Windows XP SP3(这个 ...
- 软件系统架构 https://www.lanhusoft.com/Article/349.html
跟蓝狐学习Nop--NopCommerce源码架构详解专题目录 Posted By : 蓝狐 Updated On : 2018-04-16 14:46 我们承接以下nop相关的业务,欢迎联系我们. ...