这个题目需要注意以下几点:

1)注意界线问题,箱子和人不可以越界。

2)需要判断人是否可以到达人推箱子的指定位置。

3)不可以用箱子作为标记,因为箱子可以走原来走过的地方,我们用箱子和人推箱子的方向来进行重判。定义一个Hash[8][8][8][8]来标记。

#define _CRT_SECURE_NO_DEPRECATE
#include<iostream>
#include<stack>
#include<queue>
using namespace std;
#define MAX_SIZE 8
bool Hash[MAX_SIZE][MAX_SIZE][MAX_SIZE][MAX_SIZE];
bool visit[MAX_SIZE][MAX_SIZE];
int map[MAX_SIZE][MAX_SIZE];
int dir[4][2] = { {0,1},{0,-1},{-1,0},{1,0} };
int N,M;
struct Point {
int x, y;
bool operator==(const Point&b)const {
return x == b.x&&y == b.y;
}
bool Isleg() {
if (x<1 || x>N || y<1 || y>M || map[x][y] == 1)
return false;
return true;
}
};
struct BOX {
Point person;
Point box;
int step;
};
int BFS();
int main() {
int i, j,T,res;
scanf("%d",&T);
while (T--) {
scanf("%d%d", &N, &M);
for (i = 1; i <= N; i++)
for (j = 1; j <= M; j++)
scanf("%d", &map[i][j]);
res = BFS();
printf("%d\n", res);
}
return 0;
}
bool DFS(Point &person, Point &des,Point &box) { //判断人是否可以到达指定位置
int k;
memset(visit, 0, MAX_SIZE*sizeof(visit[0]));
visit[person.x][person.y] = 1;
stack<Point> S;
S.push(person);
Point next, pos;
while (!S.empty()) {
pos = S.top();
S.pop();
if (pos == des)
return true;
for (k = 0; k < 4; k++) {
next = pos;
next.x += dir[k][0];
next.y += dir[k][1];
if (next.Isleg() && !(next==box) && !visit[next.x][next.y]) {
visit[next.x][next.y] = 1;
S.push(next);
}
}
}
return false;
}
Point serch(int x) {
Point res;
int i, j;
for (i = 1; i <= N; i++) {
for (j = 1; j <= M; j++)
if (x == map[i][j]) {
res.x = i;
res.y = j;
}
}
return res;
}
int BFS() {
int i, j,k,l;
for (i = 1; i < MAX_SIZE; i++)
for (j = 1; j < MAX_SIZE; j++)
for (k = 1; k < MAX_SIZE; k++)
for (l = 1; l < MAX_SIZE; l++)
Hash[i][j][l][k] = 0;
BOX B,Box;
B.person = serch(4);
B.box = serch(2);
B.step = 0;
Point des, next,peo;
des = serch(3);
queue<BOX> Q;
Q.push(B);
while (!Q.empty()) {
B = Q.front();
Q.pop();
if (B.box == des)
return B.step;
B.step++;
Box = B;
for (k = 0; k < 4; k++) {
next = peo=B.box;
next.x += dir[k][0];
next.y += dir[k][1];
peo.x -= dir[k][0];
peo.y -= dir[k][1];
if (peo.Isleg() && next.Isleg() &&DFS(B.person,peo,B.box)&&!Hash[peo.x][peo.y][next.x][next.y]) {
Hash[peo.x][peo.y][next.x][next.y] = 1;
Box.person = B.box;
Box.box = next;
Q.push(Box);
}
}
}
return -1;
}

  

hdu254 DFS+BFS的更多相关文章

  1. DFS/BFS+思维 HDOJ 5325 Crazy Bobo

    题目传送门 /* 题意:给一个树,节点上有权值,问最多能找出多少个点满足在树上是连通的并且按照权值排序后相邻的点 在树上的路径权值都小于这两个点 DFS/BFS+思维:按照权值的大小,从小的到大的连有 ...

  2. 【DFS/BFS】NYOJ-58-最少步数(迷宫最短路径问题)

    [题目链接:NYOJ-58] 经典的搜索问题,想必这题用广搜的会比较多,所以我首先使的也是广搜,但其实深搜同样也是可以的. 不考虑剪枝的话,两种方法实践消耗相同,但是深搜相比广搜内存低一点. 我想,因 ...

  3. ID(dfs+bfs)-hdu-4127-Flood-it!

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4127 题目意思: 给n*n的方格,每个格子有一种颜色(0~5),每次可以选择一种颜色,使得和左上角相 ...

  4. [LeetCode] 130. Surrounded Regions_Medium tag: DFS/BFS

    Given a 2D board containing 'X' and 'O' (the letter O), capture all regions surrounded by 'X'. A reg ...

  5. HDU 4771 (DFS+BFS)

    Problem Description Harry Potter has some precious. For example, his invisible robe, his wand and hi ...

  6. DFS/BFS视频讲解

    视频链接:https://www.bilibili.com/video/av12019553?share_medium=android&share_source=qq&bbid=XZ7 ...

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

    POJ 3083 -- Children of the Candy Corn(DFS+BFS) 题意: 给定一个迷宫,S是起点,E是终点,#是墙不可走,.可以走 1)先输出左转优先时,从S到E的步数 ...

  8. [LeetCode]695. 岛屿的最大面积(DFS/BFS)、200. 岛屿数量(DFS/BFS待做/并差集待做)

    695. 岛屿的最大面积 题目 给定一个包含了一些 0 和 1的非空二维数组 grid , 一个 岛屿 是由四个方向 (水平或垂直) 的 1 (代表土地) 构成的组合.你可以假设二维矩阵的四个边缘都被 ...

  9. POJ2308连连看dfs+bfs+优化

    DFS+BFS+MAP+剪枝 题意:       就是给你一个10*10的连连看状态,然后问你最后能不能全部消没? 思路:      首先要明确这是一个搜索题目,还有就是关键的一点就是连连看这个游戏是 ...

随机推荐

  1. 想进BAT?这些面试题助你一臂之力

    1 软性热身题 这种题目,考的就是你的软性能力,比如表达能力,理解能力,协调能力,一个词概括就是套路.这类题目会在面试开始热身的时候,问一道两题,不会多,但是如果你能回答的有条不紊,清晰达意,那么就会 ...

  2. Wordpress 作者模板页中的自定义帖子类型分页问题

    <?php // 获取当前页面的页数,函数的参数为 paged $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; $ ...

  3. 最少的硬币数量组合出1到m之间的任意面值(贪心算法)

    题目描述: 你有n种不同面值的硬币,每种面值的硬币都有无限多个,为了方便购物,你希望带尽量少的硬币,并且要能组合出 1 到 m 之间(包含1和m)的所有面值. 输入描述: 第一行包含两个整数:m ,n ...

  4. nyoj 题目12 喷水装置(二)

    喷水装置(二) 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 有一块草坪,横向长w,纵向长为h,在它的橫向中心线上不同位置处装有n(n<=10000)个点状的 ...

  5. vim 查找命令

    /要查找的内容      自光标起始位置向下查找 ?要查找的内容   自光标起始位置向上查找

  6. 【bzoj2527】[Poi2011]Meteors 整体二分+树状数组

    题目描述 有N个成员国.现在它发现了一颗新的星球,这颗星球的轨道被分为M份(第M份和第1份相邻),第i份上有第Ai个国家的太空站. 这个星球经常会下陨石雨.BIU已经预测了接下来K场陨石雨的情况.BI ...

  7. Java简明教程 12.多线程(multithreading)

    单线程和多线程 关于它们的区别,zhihu上有一个回答,我认为十分不错,如下: . 单进程单线程:一个人在一个桌子上吃菜. . 单进程多线程:多个人在同一个桌子上一起吃菜. . 多进程单线程:多个人每 ...

  8. Codeforces Round #363 (Div. 2) B 暴力

    Description You are given a description of a depot. It is a rectangular checkered field of n × m siz ...

  9. leetcode 389 map iterator 的使用

    class Solution { public: char findTheDifference(string s, string t) { map<char,int>Map_Temp; ; ...

  10. 自定义JQuery扩展方法

    ; (function ($, window, document, undefined) { $.getUrlParam = function (name) { var reg = new RegEx ...