题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1254

分析:

真正移动的是箱子,但是要移动箱子需要满足几个条件。

1.移动方向上没有障碍。

2.箱子后方没有障碍。

3.人可以到达箱子后方的地方。这里dfs或bfs都可以实现

按条件搜索即可。

#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <queue>
#include <cstdlib>
#include <stack>
#include <vector>
#include <set>
#include <map>
#define LL long long
#define mod 1000000007
#define inf 0x3f3f3f3f
#define N 100010
using namespace std;
typedef struct node
{
int Bx,By;
int Mx,My;
int step;
bool operator<(const node &a)const
{
return step>a.step;
}
}node;
int dx[]={,,,-};
int dy[]={,-,,};
int hash[][][][];
int vis[][],s[][];
int Bx,By,Mx,My,Nx,Ny;
int found,n,m;
node make_node(int a,int b,int x,int y)
{
node temp;
temp.Bx=a;temp.By=b;
temp.Mx=x;temp.My=y;
temp.step=;
return temp;
} int judge(int x,int y)
{
return x>=&&x<n&&y>=&&y<m&&s[x][y]!=;
}
void dfs(int Nx,int Ny,int Mx,int My)
{
if(Nx==Mx&&Ny==My)
{
found=;return;
}
for(int i=;i<&&!found;i++)
{
int x=Nx+dx[i];
int y=Ny+dy[i];
if(judge(x,y)&&!vis[x][y])
vis[x][y]=,dfs(x,y,Mx,My);
}
} void bfs(int Bx,int By,int Mx,int My)
{
priority_queue<node>que;
node p,q;
p=make_node(Bx,By,Mx,My);
que.push(p);
while(!que.empty())
{
node p=que.top();que.pop();
if(s[p.Bx][p.By]==)
{
printf("%d\n",p.step);return;
}
for(int i=;i<;i++)
{
q=p;
q.Bx=p.Bx+dx[i];//箱子移动的地方
q.By=p.By+dy[i];
Nx=p.Bx-dx[i];//箱子的后方
Ny=p.By-dy[i];
if(judge(q.Bx,q.By)&&judge(Nx,Ny)&&!hash[q.Bx][q.By][Nx][Ny])
{
memset(vis,,sizeof(vis));
vis[p.Bx][p.By]=vis[Nx][Ny]=;//注意这里箱子将成为阻碍物
found=;
dfs(Nx,Ny,p.Mx,p.My);//判断人是否可达箱子后面
if(found)
{
hash[q.Bx][q.By][Nx][Ny]=;
q.Mx=p.Bx;q.My=p.By;q.step++;
que.push(q);
}
}
}
}
printf("-1\n");
return;
}
void init()
{
memset(hash,,sizeof(hash));
memset(s,,sizeof(s));
for(int i=;i<n;i++)
for(int j=;j<m;j++)
{
scanf("%d",&s[i][j]);
if(s[i][j]==)
{
Bx=i;By=j;
}
if(s[i][j]==)
{
Mx=i;My=j;
}
}
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
init();
bfs(Bx,By,Mx,My);
}
}

hdu1254(bfs+dfs)的更多相关文章

  1. Cleaning Robot (bfs+dfs)

    Cleaning Robot (bfs+dfs) Here, we want to solve path planning for a mobile robot cleaning a rectangu ...

  2. hdu 4771 求一点遍历全部给定点的最短路(bfs+dfs)

    题目如题.题解如题. 因为目标点最多仅仅有4个,先bfs出俩俩最短路(包含起点).再dfs最短路.)0s1A;(当年弱跪杭州之题,现看如此简单) #include<iostream> #i ...

  3. HDU1254--推箱子(BFS+DFS)

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

  4. 图的基本遍历算法的实现(BFS & DFS)复习

    #include <stdio.h> #define INF 32767 typedef struct MGraph{ ]; ][]; int ver_num, edge_num; }MG ...

  5. HDU 1044 Collect More Jewels(BFS+DFS)

    Collect More Jewels Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe ...

  6. 图的遍历(bfs+dfs)模板

    bfs #include<iostream> #include<queue> #include<cstdio> using namespace std; queue ...

  7. POJ-3083 Children of the Candy Corn (BFS+DFS)

    Description The cornfield maze is a popular Halloween treat. Visitors are shown the entrance and mus ...

  8. POJ 3126 Prime Path(BFS算法)

    思路:宽度优先搜索(BFS算法) #include<iostream> #include<stdio.h> #include<cmath> #include< ...

  9. Addition Chains POJ - 2248 (bfs / dfs / 迭代加深)

    An addition chain for n is an integer sequence <a0, a1,a2,...,am=""> with the follow ...

随机推荐

  1. 关于android多点触控

    最近项目需要一个多点触控缩放的功能.然后上网查了下资料 总结一下: 首先android sdk版本很重要,比如你在AndroidManifest.xml中指定android:minSdkVersion ...

  2. spring中bean的一些知识点

    知识点1: 实例化bean的3种方法. 1.      使用类构造器 (90%用这个方法) 2.      使用静态工厂方法 3.      使用实例化工厂 知识点2: 看这段代码 Applicati ...

  3. Redis + Jedis + Spring整合遇到的异常(转)

    项目中需要用到缓存,经过比较后,选择了redis,客户端使用jedis连接,也使用到了spring提供的spring-data-redis.配置正确后启动tomcat,发现如下异常: Caused b ...

  4. Leetcode:find_minimum_in_rotated_sorted_array

    一.     题目 给定一个排好序的数组.数组可能是单调递增,也可能有一个变换. (i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2) 要求找出最小的数. ...

  5. WindowsPhone8中实现圆形图片的生成显示

    原文 WindowsPhone8中实现圆形图片的生成显示 很多软件中(比如QQ)用到了许多圆形图片,作为用户头像等等,原始图片往往是方形的,那么怎么样将方形的图片显示成圆形呢? 一种方法是当背景为固定 ...

  6. 【ASP.NET Web API教程】2 创建各种Web API

    原文 [ASP.NET Web API教程]2 创建各种Web API Chapter 2: Creating Web APIs第2章 创建各种Web API 本文引自:http://www.asp. ...

  7. [置顶] ※数据结构※→☆线性表结构(queue)☆============队列 顺序存储结构(queue sequence)(八)

    队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表.进行插入操作的端称为队尾,进行删除操作的 ...

  8. javascript事件委托,事件代理,元素绑定多个事件之练习篇

    <ul id="parent-list"> <li id="post-1">item1</li> <li id=&qu ...

  9. Lucene.Net 2.3.1开发介绍 —— 四、搜索(一)

    原文:Lucene.Net 2.3.1开发介绍 -- 四.搜索(一) 既然是内容筛选,或者说是搜索引擎,有索引,必然要有搜索.搜索虽然与索引有关,那也只是与索引后的文件有关,和索引的程序是无关的,因此 ...

  10. 【Demo 0008】标签控制器

    本章学习要点:       1.  了解标签控制器基础知识;       2.  掌握标签控制器层次结构;       3.  掌握标签控制器基本用法;       4.  掌握自定义标签控制器:   ...