题目链接:http://icpc.njust.edu.cn/Problem/Hdu/1732/

题目就是推箱子游戏,有三个箱子和三个洞,最终目标状态就是三个箱子到三个洞中,所以我们搜索的状态就是人的位置和箱子的位置,因为总共8个状态值,而且横纵坐标的范围也不大,所以我们可以考虑一个8维的数组来存储状态。

代码如下:

#include<bits/stdc++.h>
using namespace std;
typedef unsigned int ui;
typedef long long ll;
typedef unsigned long long ull;
#define pf printf
#define mem(a,b) memset(a,b,sizeof(a))
#define prime1 1e9+7
#define prime2 1e9+9
#define pi 3.14159265
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define scand(x) scanf("%llf",&x)
#define f(i,a,b) for(int i=a;i<=b;i++)
#define scan(a) scanf("%d",&a)
#define dbg(args) cout<<#args<<":"<<args<<endl;
#define inf 0x3f3f3f3f
#define maxn 10
int n,m,t;
char Map[maxn][maxn];
bool vis[][][][][][][][];
int dir[][]={,,,-,,,-,};
typedef struct{
int x,y;
}point;
struct node{
point h,v[];//状态就是四个位置
int step;
bool check()//检查目标状态是否达到
{
f(i,,)
{
if(Map[v[i].x][v[i].y]!='@')return false;//只要有一个不在洞中就不是目标状态
}
return true;
}
bool ok()//检测人所在的位置在初始地图中是否可行
{
return h.x>=&&h.x<n&&h.y>=&&h.y<m&&Map[h.x][h.y]!='#';
}
int judge()//判断人所在的位置有没有箱子,有则返回箱子的号码
{
f(i,,)
{
if(h.x==v[i].x&&h.y==v[i].y)
return i;
}
return -;
}
};
node st;
void setvis(node& a)
{
vis[a.h.x][a.h.y][a.v[].x][a.v[].y][a.v[].x][a.v[].y][a.v[].x][a.v[].y]=;
}
bool getvis(node& a)
{
return vis[a.h.x][a.h.y][a.v[].x][a.v[].y][a.v[].x][a.v[].y][a.v[].x][a.v[].y];
}
bool cango(node a,int num,int i)//箱子可以被推移一格
{
a.v[num].x+=dir[i][];
a.v[num].y+=dir[i][];
if(a.v[num].x<||a.v[num].x>=n||a.v[num].y<||a.v[num].y>=m||Map[a.v[num].x][a.v[num].y]=='#')return false;
f(j,,)
{
if(j==num)continue;//如果有其他箱子则不可行
if(a.v[j].x==a.v[num].x&&a.v[j].y==a.v[num].y)return false;
}
return true;
}
node cur,nxt;
int bfs()
{
queue<node>q;
q.push(st);
setvis(st);
int t;
while(!q.empty())
{
cur=q.front();
q.pop();
if(cur.check())
{
return cur.step;
}
f(i,,)
{
nxt=cur;
nxt.h.x+=dir[i][];//人先移动
nxt.h.y+=dir[i][];
nxt.step++;
if(nxt.ok())//该位置可走 ,即在原地图中不是墙
{
t=nxt.judge();//判断有没有箱子,有箱子的话就判断能不能推走
if(t==-)//该位置上没有箱子又是可走的,说明此时是陆地
{
if(!getvis(nxt))
{
setvis(nxt);
q.push(nxt);
}
}
else
{
if(cango(nxt,t,i))
{
nxt.v[t].x+=dir[i][];
nxt.v[t].y+=dir[i][];
if(!getvis(nxt))
{
setvis(nxt);
q.push(nxt);
}
}
}
}
}
}
return -;
}
int main()
{
//freopen("input.txt","r",stdin);
//freopen("output.txt","w",stdout);
std::ios::sync_with_stdio(false);
while(scanf("%d%d",&n,&m)!=EOF)
{
int cnt=;
mem(vis,false);
f(i,,n-)
f(j,,m-)
{
scanf(" %c",&Map[i][j]);
if(Map[i][j]=='X')
{
st.h.x=i,st.h.y=j;
st.step=;
}
if(Map[i][j]=='*')
{
st.v[cnt].x=i;
st.v[cnt++].y=j;
}
}
pf("%d\n",bfs());
}
}

hdu1732 Pushbox bfs 细节比较多,需要注意的更多相关文章

  1. HDU 2612 -Find a way (注重细节BFS)

    主题链接:Find a Way 题目不难,前几天做,当时准备写双向BFS的,后来处理细节上出了点问题,赶上点事搁置了.今天晚上重写的,没用双向,用了两次BFS搜索,和双向BFS 道理差点儿相同.仅仅是 ...

  2. HDU 2612 (2次BFS,有点小细节)

    Problem Description Pass a year learning in Hangzhou, yifenfei arrival hometown Ningbo at finally. L ...

  3. POJ 3278 Catch That Cow (有思路有细节的bfs)

    Description Farmer John has been informed of the location of a fugitive cow and wants to catch her i ...

  4. bfs简单题-poj2251

    宽搜基础题 思路很简单,注意细节. 走过的节点一定要打上标记//tag数组 三维字符串输入一定要注意 #include <stdio.h> #include <iostream> ...

  5. loj 1165(bfs+康托展开)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=26879 思路:题目意思很简单,就是通过一些位置的交换,最后变成有序 ...

  6. 北京网络赛G BOXES 状态压缩+有序BFS+高维数组判重

    #include <bits/stdc++.h> using namespace std; ]; ][]; ][][]; ][][][]; ][][][][]; ][][][][][]; ...

  7. 图-用DFS求连通块- UVa 1103和用BFS求最短路-UVa816。

    这道题目甚长, 代码也是甚长, 但是思路却不是太难.然而有好多代码实现的细节, 确是十分的巧妙. 对代码阅读能力, 代码理解能力, 代码实现能力, 代码实现技巧, DFS方法都大有裨益, 敬请有兴趣者 ...

  8. hdu - 2102 A计划 (简单bfs)

    http://acm.hdu.edu.cn/showproblem.php?pid=2102 题目还是不难,注意起点一定是(0,0,0),然后到达P点时间<=t都可以. 用一个3维字符数组存储图 ...

  9. 8.1搜索专练DFS和BFS

    这是第一次全部做出来的依次练习了,有一些都是做过两遍了的,但是还是错了几回,更多时候我还是应该多注意下细节,就好像章爷笑我 的一样,像什么vis[]标记没清0,什么格式错误,还有什么题目没看清,还是的 ...

随机推荐

  1. 软件测试人必备的 Python 知识图

    之前发过蛮多不少关于 Python 学习的文章,收到大家不少的好评,不过大家也有许多困惑: 现在测试不好做,是不是真的该重新去学一门热门的语言? 入门 Python 该学哪些知识点?该看哪些书? 可以 ...

  2. 自研测试框架ktest介绍(适用于UI和API)

    iTesting,爱测试,爱分享 在自动化测试的过程中,测试框架是我们绕不过去的一个工具,无论你是不需要写代码直接改动数据生成脚本,还是你需要检查测试结果甚至持续集成,测试框架都在发挥它的作用. 不同 ...

  3. 海洋深处的数据中心——微软Natick项目

    数据中心(data center)是云计算的支柱,云计算的蓬勃发展离不开数据中心在建造运营方面的不断创新.但云端数据中心的运行过程中会产生大量热量,冷却降温过程则意味着巨大的能源消耗,这意味着需要庞大 ...

  4. 「知乎」对中国用户而言,Pure Android 是否比 MIUI 或 Flyme 体验更好? - Donnie的博客

    这篇文章转载自我在知乎上的回答 哎呀-不要站队嘛.其实这是一个很有意思的题目,让我们一点点来看 哦对,谢妖-.本人是Nexus 5用户,系统当然是Pure Android KitKat啦(臭谷粉!点D ...

  5. USB描述符(转)

    //============================================================================// 文件名: USBDESC.C// 用 ...

  6. Simplifying Conditional Expressions(简化条件表达式)

    1.Decompose Conditional(分解条件表达式) 2.Consolidate Conditional Expressions(合并条件表达式) 3.Consolidate Duplic ...

  7. ysoserial-调试分析总结篇(1)

    前言: ysoserial很强大,花时间好好研究研究其中的利用链对于了解java语言的一些特性很有帮助,也方便打好学习java安全的基础,刚学反序列化时就分析过commoncollections,但是 ...

  8. java集合-set

    #java集合-set Map用于存储key-value的映射,其中key的值是不能重复的.并且还需要正确的覆写equals方法和hashCode方法 如果我们只需要存储不重复的key,并不需要存储对 ...

  9. Hibernate入门之注解@Column详解

    前言 上一节我们讲解了Hibernate的主键生成策略,本节我们继续来讲讲Hibernate中针对列的映射即@Column注解,文中若有错误之处,还望指正. @Column注解详解 我们看到如上针对列 ...

  10. 前端每日实战:114# 视频演示如何用纯 CSS 和混色模式创作一个 loader 动画

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/MqYroW 可交互视频 此视频是可 ...