推箱子

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 6021    Accepted Submission(s): 1718

Problem Description
推箱子是一个很经典的游戏.今天我们来玩一个简单版本.在一个M*N的房间里有一个箱子和一个搬运工,搬运工的工作就是把箱子推到指定的位置,注意,搬运工只能推箱子而不能拉箱子,因此如果箱子被推到一个角上(如图2)那么箱子就不能再被移动了,如果箱子被推到一面墙上,那么箱子只能沿着墙移动.
现在给定房间的结构,箱子的位置,搬运工的位置和箱子要被推去的位置,请你计算出搬运工至少要推动箱子多少格.
 
Input
输入数据的第一行是一个整数T(1<=T<=20),代表测试数据的数量.然后是T组测试数据,每组测试数据的第一行是两个正整数M,N(2<=M,N<=7),代表房间的大小,然后是一个M行N列的矩阵,代表房间的布局,其中0代表空的地板,1代表墙,2代表箱子的起始位置,3代表箱子要被推去的位置,4代表搬运工的起始位置.
 
Output
对于每组测试数据,输出搬运工最少需要推动箱子多少格才能帮箱子推到指定位置,如果不能推到指定位置则输出-1.
 
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

 #include<stdio.h>
#include<string.h>
#include<math.h>
#include<queue>
int T ;
int n , m ;
const int M = ;
int map[M][M] ;
bool vis[M][M][M][M] ;
int move[][] = {{,} , {- , } , {,} , { , -} } ;
struct node
{
int x , y ;
int a , b ;
int time ;
bool operator < (const node &rhs ) const
{
return time > rhs.time ;
}
}; int bfs (int sx , int sy , int mx , int my , int ex , int ey)
{
//printf ("Last---> (%d,%d)\n" , ex , ey ) ;
node ans , tmp ;
std::priority_queue<node> q ;
memset (vis , , sizeof(vis)) ;
while ( !q.empty ()) q.pop () ;
q.push ( (node) {sx , sy , mx , my , }) ;
vis[sx][sy][mx][my] = ;
if (mx == ex && my == ey) return ;
while ( !q.empty ()) {
ans = q.top () ; q.pop () ;
// printf ("S----(%d,%d) tui (%d,%d)\n" , ans.x , ans.y , ans.a , ans.b ) ;
for (int i = ; i < ; i ++) {
tmp = ans ;
tmp.x += move[i][] ; tmp.y += move[i][] ;
if (tmp.x < || tmp.y < || tmp.x == n || tmp.y == m) continue ;
if (map[tmp.x][tmp.y] == ) continue ;
if (tmp.x == tmp.a && tmp.y == tmp.b ) {
int x = tmp.x + move[i][] , y = tmp.y + move[i][] ;
if (x < || y < || x == n || y == m) continue ;
if (map[x][y] == ) continue ;
tmp.a = x , tmp.b = y ;
tmp.time ++ ;
}
if (vis[tmp.x][tmp.y][tmp.a][tmp.b]) continue ;
vis[tmp.x][tmp.y][tmp.a][tmp.b] = ;
q.push (tmp ) ;
// printf ("(%d,%d) tui (%d,%d)\n" , tmp.x , tmp.y , tmp.a , tmp.b ) ;
if (tmp.a == ex && tmp.b == ey) return tmp.time ;
}
}
return - ;
} int main ()
{
//freopen ("a.txt" , "r" , stdin ) ;
scanf ("%d" , &T ) ;
while (T --) {
scanf ("%d%d" , &n , &m ) ;
int k ;
int sx , sy , ex , ey , mx , my ;
for (int i = ; i < n ; i ++) for (int j = ; j < m ; j ++) scanf ("%d" , &map[i][j]) ;
for (int i = ; i < n ; i ++) {
for (int j = ; j < m ; j ++) {
if (map[i][j] == ) sx = i , sy = j ;
else if (map[i][j] == ) mx = i , my = j ;
else if (map[i][j] == ) ex = i , ey = j ;
}
}
if ( (k = bfs (sx , sy , mx , my , ex , ey )) == -) puts ("-1") ;
else printf ("%d\n" , k ) ;
}
return ;
}
[ Copy to Clipboard ] [ Save to File]

hdu.1254.推箱子(bfs + 优先队列)的更多相关文章

  1. HDU 1254 推箱子 BFS

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1254 题目分析: 做这道题,感觉挺简单的,做着做着就错了20次, 我也是醉了, WA到吐的节奏啊! 思 ...

  2. hdu - 1254 推箱子 (bfs+bfs)

    http://acm.hdu.edu.cn/showproblem.php?pid=1254 题目意思很简单,只要思路对就好. 首先考虑搬运工能否到达推箱子的那个点,这个可以根据箱子前进方向得出搬运工 ...

  3. HDU 1254 推箱子(BFS加优先队列)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1254 推箱子 Time Limit: 2000/1000 MS (Java/Others)    Me ...

  4. HDU 1254 推箱子(BFS)

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

  5. hdu 1254 推箱子(双重bfs)

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

  6. hdu 1254 推箱子(嵌套搜索,bfs中有dfs)

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

  7. hdu 1254 推箱子(搜索)

    我写的第一道感觉比较难的搜索 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1254 首先要推箱子的话要满足人能够在箱子旁边,而且人的对面也是可通的. ...

  8. [HDU 1254] 推箱子

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

  9. HDU 1254 推箱子游戏(搞了一下午。。。)

    中文题目:http://acm.hdu.edu.cn/showproblem.php?pid=1254 一开始常规的人用来做主导,想着想着不对劲,其实是箱子为主导,人只是箱子能否推进的一个判断. 可以 ...

随机推荐

  1. CentOS关闭火狐浏览器Flash过期提示

    关闭旧版插件屏蔽提示 打开 about:config?filter=extensions.blocklist.enabled 右键切换,关闭flash版本过旧被屏蔽的提示. 参考: http://ti ...

  2. iOS 获得当前经纬度和城市

    1.引入CoreLocation.framework,#import <CoreLocation/CoreLocation.h>,添加委托CLLocationManagerDelegate ...

  3. javascript 未来新方法的介绍

    JavaScript1.6数组方法的扩展 var tmp = [1, 2, 3, 4, 5, 3]; console.log('indexOf:找出数组中某一对象的下标,如果没有则为-1'); con ...

  4. LightOj1089(求点包含几个线段 + 线段树)

    题目链接 题意:n( n <= 50000 ) 个线段,q ( q <= 50000) 个点,问每个点在几个线段上 线段端点的和询问的点的值都很大,所以必须离散化 第一种解法:先把所有的线 ...

  5. BZOJ3685: 普通van Emde Boas树

    显然这题的所有操作都可以用set,但是直接用set肯定要T,考虑到读入量较大,使用fread读入优化,就可以卡过去了. #include<bits/stdc++.h> using name ...

  6. JavaWeb学习笔记——Tomcat配置

    使用的Tomcat版本是apache-tomcat-6.0.20 详细的环境变量配置参考<windows 7系统安装与配置Tomcat服务器环境> 网址为http://jingyan.ba ...

  7. CV界的明星人物们

    CV界的明星人物们 来自:http://blog.csdn.net/necrazy/article/details/9380151,另外根据自己关注的地方,加了点东西. 今天在cvchina论坛上看到 ...

  8. C风格字符串与C++风格字符串

    C风格字符串与C++风格字符串 C风格字符串:对字符串进行操作的 C 函数定义在头文件<cstring>中: 1. 字符串定义:char* result: 2. 字符串的最后一个字符是nu ...

  9. macbook pro的usb串口失效的的处理方法

    macbook pro的usb串口失效的的处理方法 2011-08-24 12:14:32|  分类: mac|举报|字号 订阅     今天开电脑,无端端一个usb的串口失效了,接入鼠标 iphon ...

  10. [Unity] Unity3D研究院编辑器之自定义默认资源的Inspector面板

    比如编辑模式下对场景或者特定文件夹有一些操作可以在这个面板里来完成.. 代码如下. using UnityEngine; using System.Collections; using UnityEd ...