题目链接: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. AI在自动化测试领域的应用

    阿里QA导读:最近一两年随着深入学习技术浪潮的诞生,智能化测试迎来了新的发展,而AI也会引领下一代测试的新航向.Testin云测CTO陈冠诚先生的分享让我们看到AI在移动自动化测试领域里面的创新机会点 ...

  2. Welcome to Erhan Blog

    "Yeah It's on. " 前言 Erhan 的 Blog 就这么开通了. 跳过废话,直接看技术实现 2018 年,Hux 总算有个地方可以好好写点东西了. 作为一个程序员, ...

  3. RocketMQ介绍与实践

    一.RocketMQ介绍         1.相关术语名词 1.  NameSrv:是一个几乎无状态节点,可集群部署,节点之间无任何信息同步. 2.  Broker:分为Master与Slave,一个 ...

  4. Android系统使用Shell脚本预装apk

    客户需求:需要在Android系统预安装一个或者若干个apk,客户可以选择自行卸载并且卸载后系统再次启动并不会再次自动安装. 考虑到需要批量安装应用,我这里考虑到使用灵活的shell脚本.shell脚 ...

  5. 对话|首席研究员童欣:从长远看,AR的应用范围远比VR广泛

    ​童欣博士现任微软亚洲研究院网络图形组首席研究员.1993年毕业于浙江大学计算机系,获工学学士学位:1996年获浙江大学计算机系硕士学位:1999年获清华大学计算机系博士学位,同年加入微软亚洲研究院. ...

  6. 这个黑科技iPhone8会用吗?人体传送密码解开锁屏

    ​ 随着现代化信息技术的发展,人们对信息安全也是愈发关注,数据安全始终是个热点和难点.通过WIFI或者蓝牙进行密码传输确实非常方便,但是它已经不再具备安全保障.因此为了解决信息安全的问题,华盛顿大学的 ...

  7. 无线城域网 WMAN

    无线城域网 WMAN (Wireless Metropolitan Area Network) 1.1.概述 2002 年 4 月通过了 802.16 无线城域网的标准.欧洲的 ETSI 也制订类似的 ...

  8. Web Scraper 高级用法——抓取属性信息 | 简易数据分析 16

    这是简易数据分析系列的第 16 篇文章. 这期课程我们讲一个用的较少的 Web Scraper 功能--抓取属性信息. 网页在展示信息的时候,除了我们看到的内容,其实还有很多隐藏的信息.我们拿豆瓣电影 ...

  9. LeetCode---二叉树3-总结例题

    二叉树-总结例题 1-从中序与后序遍历序列构造二叉树 给定二叉树的后序遍历和二叉树的中序遍历 想法: 先根据后序遍历的最后一个元素构造根节点 寻找根节点在中序遍历中的位置 递归构建根节点的左右子树 / ...

  10. checkbox,radio自定义美化表单

    原理 利用label标签,包裹input的时候,点击label等同于点击input,再用背景图片显示选中和取消选中状态 效果 图片 复选 <!DOCTYPE html> <html& ...