推箱子

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

Problem Description

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

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

 
Input

入数据的第一行是一个整数T(1<=T<=20),代表测试数据的数量.然后是T组测试数据,每组测试数据的第一行是两个正整数M,N(2&
lt;=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
 
Author
 
好多坑的一道题。。。很好的一道题。。。参考了别人的代码。。真的做不出来。。。每次结点存个新的图。。get。。。做了才知道。。。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <queue>
#include <algorithm>
using namespace std;
int n,m;
int graph[][];
bool flag[][][];
bool vis[][];
int dir[][] = {{,},{-,},{,},{,-}};
struct Node
{
int x,y;
int step;
int g[][];
}s,person,t;
bool check(int x,int y)
{
if(x<||x>=n||y<||y>=m) return false;
return true;
}
bool bfs2(Node s,Node target){
person = s;
for(int i=;i<n;i++){
for(int j=;j<m;j++){
if(person.g[i][j]==){
person.x = i;
person.y = j;
person.step = ;
}
}
}
queue<Node>q;
memset(vis,false,sizeof(vis));
q.push(person);
vis[person.x][person.y] = true;
while(!q.empty()){
Node now = q.front();
q.pop();
if(now.x==target.x&&now.y==target.y){
return true;
}
Node next;
for(int i=;i<;i++){
next.step = now.step+;
next.x = now.x +dir[i][];
next.y = now.y + dir[i][];
if(!check(next.x,next.y)||s.g[next.x][next.y]==||vis[next.x][next.y]||s.g[next.x][next.y]==) continue;
vis[next.x][next.y] = true;
q.push(next);
}
}
return false;
}
int bfs(){
memset(flag,false,sizeof(flag));
queue <Node> q;
q.push(s);
while(!q.empty()){
Node now = q.front();
q.pop();
if(now.x==t.x&&now.y==t.y) return now.step;
Node next,target;
for(int i=;i<;i++){
next = now;
next.x = now.x+dir[i][];
next.y = now.y+dir[i][];
next.step = now.step+;
if(!check(next.x,next.y)||flag[next.x][next.y][i]||next.g[next.x][next.y]==) continue; ///该方向已经走过了
///人的目标点(人以此点为目标点将箱子从now推向next)
target.x = now.x - dir[i][];
target.y = now.y - dir[i][];
if(!check(target.x,target.y)) continue;
if(bfs2(next,target)){
swap(next.g[now.x][now.y],next.g[next.x][next.y]);
swap(next.g[target.x][target.y],next.g[person.x][person.y]);
flag[next.x][next.y][i] = true;
q.push(next);
}
}
}
return -;
}
int main()
{
int tcase;
scanf("%d",&tcase);
while(tcase--)
{
scanf("%d%d",&n,&m);
for(int i=; i<n; i++)
for(int j=; j<m; j++){
scanf("%d",&s.g[i][j]);
if(s.g[i][j]==){
s.x = i;
s.y = j;
s.step = ;
}
if(s.g[i][j]==){
t.x = i;
t.y = j;
}
}
int res = bfs();
printf("%d\n",res);
}
}

hdu 1254(搜索题)的更多相关文章

  1. hdu&&poj搜索题题号

    搜索 hdu1067 哈希 hdu1401 双向搜索 hdu1430 哈希 hdu1667 跌搜+启发式函数 hdu1685 启发式搜索 hdu1813 启发式搜索 hdu1885 状态压缩搜索 hd ...

  2. [HDU 2102] A计划(搜索题,典型dfs or bfs)

    A计划 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  3. Square HDU 1518 搜索

    Square HDU 1518 搜索 题意 原题链接 给你一定若干个木棒,让你使用它们组成一个四边形,要求这些木棒必须全部使用. 解题思路 木棒有多种组合方式,使用搜索来进行寻找,这里需要进行优化,不 ...

  4. O - 推箱子 HDU - 1254(bfs_box + bfs_man)

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

  5. bnuoj 33656 J. C.S.I.: P15(图形搜索题)

    http://www.bnuoj.com/bnuoj/problem_show.php?pid=33656 [题解]:暴力搜索题 [code]: #include <iostream> # ...

  6. HDU(搜索专题) 1000 N皇后问题(深度优先搜索DFS)解题报告

    前几天一直在忙一些事情,所以一直没来得及开始这个搜索专题的训练,今天做了下这个专题的第一题,皇后问题在我没有开始接受Axie的算法低强度训练前,就早有耳闻了,但一直不知道是什么类型的题目,今天一看,原 ...

  7. 历年NOIP中的搜索题

    什么题目都不会做于是开始做搜索题. 然而我搜索题也不会做了. 铁定没戏的蒟蒻. 1.NOIP2004 虫食算 “对于给定的N进制加法算式,求出N个不同的字母分别代表的数字,使得该加法算式成立.输入数据 ...

  8. hdu 5887 搜索+剪枝

    Herbs Gathering Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  9. hdu 5636 搜索 BestCoder Round #74 (div.2)

    Shortest Path  Accepts: 40  Submissions: 610  Time Limit: 4000/2000 MS (Java/Others)  Memory Limit: ...

随机推荐

  1. 【dp】P1982 小朋友的数字

    有趣的细节题目 题目描述 有 n 个小朋友排成一列.每个小朋友手上都有一个数字,这个数字可正可负.规定每个小朋友的特征值等于排在他前面(包括他本人)的小朋友中连续若干个(最少有一个)小朋友手上的数字之 ...

  2. matplotlib绘图(三)

    matplotlib中2D图形的绘制 直方图 直方图的参数只有一个x,不像条形图需要传入x,y 直方图作用:是统计x在某个区间上出现的次数 直方图是条形图的一种形式 hist()的参数: #bins ...

  3. vmware虚拟机安装Windows 7后虚拟机自动挂起

    vmware虚拟机安装windows7后在一段时间中没有操作,虚拟机会自动挂起,是因为windows7中的设置的自动睡眠,打开[控制面板]=>[电源选项]=>[选择关闭显示器时间]将下面两 ...

  4. Oracle rownum的理解

    核心过程分三步: 从表中取出行(无索引的话,顺序取出). 根据当前结果集,为当前行添加rownum. 条件筛选,如通过则添加到结果集中. 完.

  5. Java-downloadFileByLink

    import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.ByteArrayOutputStr ...

  6. 监控网络流量iftop和nethogs安装

    服务器环境是centos7,centos下通常使用iftop,或者nethogs来进行网络流量监控.这2个工具都需要先安装epel,因为这个库通常操作系统是不自带的.那么就先安装epel,使用的命令是 ...

  7. UVa 10655 Contemplation! Algebra 矩阵快速幂

    题意: 给出\(p=a+b\)和\(q=ab\),求\(a^n+b^n\). 分析: 这种题目关键还是在于构造矩阵: \(\begin{bmatrix} 0 & 1 \\ -(a+b) &am ...

  8. Django之include本质

    一. URL name详解 from django.conf.urls import url from django.contrib import admin from calc import vie ...

  9. seleniumIDE使用

    1.selenium IDE使用:适用于火狐浏览器 2.界面按钮包括录制(右上角的红点),运行脚本(中上页的绿色三角,包括依次运行和单个运行的2个运行按钮) 3.导出文件为.java,在文件选项中

  10. 为什么在header 和 session 之前不能有输出

    1.在header输出之前有输出内容的话,就会造成对header的错误理解(尽管现在已经能容错了),例如不是满足“keyword: value\n”的格式还好,直接错误了,但是满足“keyword: ...