hdu1732 Pushbox bfs 细节比较多,需要注意
题目链接: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 细节比较多,需要注意的更多相关文章
- HDU 2612 -Find a way (注重细节BFS)
主题链接:Find a Way 题目不难,前几天做,当时准备写双向BFS的,后来处理细节上出了点问题,赶上点事搁置了.今天晚上重写的,没用双向,用了两次BFS搜索,和双向BFS 道理差点儿相同.仅仅是 ...
- HDU 2612 (2次BFS,有点小细节)
Problem Description Pass a year learning in Hangzhou, yifenfei arrival hometown Ningbo at finally. L ...
- 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 ...
- bfs简单题-poj2251
宽搜基础题 思路很简单,注意细节. 走过的节点一定要打上标记//tag数组 三维字符串输入一定要注意 #include <stdio.h> #include <iostream> ...
- loj 1165(bfs+康托展开)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=26879 思路:题目意思很简单,就是通过一些位置的交换,最后变成有序 ...
- 北京网络赛G BOXES 状态压缩+有序BFS+高维数组判重
#include <bits/stdc++.h> using namespace std; ]; ][]; ][][]; ][][][]; ][][][][]; ][][][][][]; ...
- 图-用DFS求连通块- UVa 1103和用BFS求最短路-UVa816。
这道题目甚长, 代码也是甚长, 但是思路却不是太难.然而有好多代码实现的细节, 确是十分的巧妙. 对代码阅读能力, 代码理解能力, 代码实现能力, 代码实现技巧, DFS方法都大有裨益, 敬请有兴趣者 ...
- hdu - 2102 A计划 (简单bfs)
http://acm.hdu.edu.cn/showproblem.php?pid=2102 题目还是不难,注意起点一定是(0,0,0),然后到达P点时间<=t都可以. 用一个3维字符数组存储图 ...
- 8.1搜索专练DFS和BFS
这是第一次全部做出来的依次练习了,有一些都是做过两遍了的,但是还是错了几回,更多时候我还是应该多注意下细节,就好像章爷笑我 的一样,像什么vis[]标记没清0,什么格式错误,还有什么题目没看清,还是的 ...
随机推荐
- 29.eval函数
eval 函数 eval() 函数十分强大 -- 将字符串 当成 有效的表达式 来求值 并 返回计算结果 123456789101112131415 # 基本的数学计算In [1]: eval(&qu ...
- javaScript系列 [28]
本文介绍JavaScript事件相关的知识点,主要包括事件流.事件处理程序.事件对象(event)以及常见事件类型和事件委托等相关内容. 在网页开发涉及的三种基础技术(HTML CSS JavaScr ...
- 手工创建 efi,msr 分区 · Virgil Chan
昨天在帮同学装 win10 的时候,不小心(不知道那是什么东西)把原系统的 efi 和 msr 盘删了,用 WinNTsetup 安装时 EFI PART 总显示红叉,安装后也进不去系统,想想应该是找 ...
- 正则表达式之RegExp对象
1.定义 RegExp对象是原生JavaScript中表示正则表达式的对象:是正则表达式(regular expression)的简写.有一点需要明确知道,正则表达式只能对字符串进行操作. 2.语法 ...
- marquee上下无缝滚动
<!DOCTYPE html><html><head><meta charset="utf-8"><meta name=&qu ...
- LeetCode 题解 | 1. 两数之和
题目描述: 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数. 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用. 示例: 给定 nums = [2, 7, 11, 15], t ...
- 分割文件和数据(linux)
在某些情况下,必须把文件分割成多个更小的片段.如今我们分割文件的目的比如:提高可读性.生成日志.通过Email发送文件等等. 假设我们有一个erro.log的测试文件,其大小为14M.你可以将该文件分 ...
- python xlwings Excel 内容截图
import xlwings as xw from PIL import ImageGrab def excel_save_img(path, sheet=0, img_name="1&qu ...
- 放弃了程序员互联网高薪,跑去事业单位做IT的尴尬
“你是程序员对吧?”“是啊,怎么了?”“那你帮我修一下电脑吧.”我原来也是一个重点大学毕业,基本上事业里面搞IT就干这些事情,要是以前,我肯定会想,我是程序员和修电脑有啥关系. 但是自从进了事业单位, ...
- paddlepaddle目标检测之水果检测(yolov3_mobilenet_v1)
一.创建项目 (1)进入到https://aistudio.baidu.com/aistudio/projectoverview/public (2)创建项目 点击添加数据集:找到这两个 然后创建即可 ...