http://acm.hdu.edu.cn/showproblem.php?pid=1254

暴搜,状态是四维的(箱子和人的坐标),向一个方向推箱子还要判断人能否走到推的位置,1A

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std; int n, m;
int tx, ty;
int vis[][][][],vis1[][];
int M[][]; struct node {
int x, y, px, py, step;
node() {};
node(int x, int y, int px, int py, int step) :
x(x), y(y), px(px), py(py), step(step) {
};
}; node st; int dx[]={,-,,};
int dy[]={,,,-}; struct point {
int x, y;
point(int x, int y) :
x(x), y(y) {
};
}; int bfs1(int x, int y, int px, int py) {
queue <point> q;
q.push(point(px, py));
while(!q.empty()) {
point u = q.front();
q.pop();
if(u.x == x && u.y == y) return ;
for(int i = ; i < ; i++){
int xx = u.x + dx[i];
int yy = u.y + dy[i];
if(xx < || yy < || xx >=n || yy >= m) continue ;
if(M[xx][yy] == || vis1[xx][yy]) continue;
vis1[xx][yy] = ;
q.push(point(xx, yy));
}
}
return ;
}; int bfs2() {
queue <node> q;
memset(vis, , sizeof(vis));
q.push(st);
vis[st.x][st.y][st.px][st.py] = ;
while(!q.empty()) {
node u = q.front();
q.pop();
if(u.x == tx && u.y == ty) return u.step;
for(int i = ; i < ; i++) {
int xx = u.x + dx[i];
int yy = u.y + dy[i];
int px = u.x - dx[i];
int py = u.y - dy[i];
if(xx < || yy < || xx >= n || yy >=m || px < || py < || px >= n || py >= m) continue;
if(M[xx][yy] == || M[px][py] == ) continue;
if(vis[xx][yy][px][py]) continue;
memset(vis1, , sizeof(vis1));
vis1[u.x][u.y] = ;
int flag = bfs1(px, py, u.px, u.py);
vis1[u.x][u.y] = ;
if(flag) {
vis[xx][yy][px][py] = ;
q.push(node(xx, yy, px, py, u.step + ));
}
}
}
return -;
}; int main() {
int T;
scanf("%d", &T);
while(T--) {
scanf("%d%d", &n, &m);
for(int i = ; i < n; i++) {
for(int j = ; j < m; j++) {
scanf("%d", &M[i][j]);
}
}
for(int i = ; i < n; i++) {
for(int j = ; j < m; j++) {
if(M[i][j] == )
tx = i, ty = j;
if(M[i][j] == )
st.x = i, st.y = j;
if(M[i][j] == )
st.px = i, st.py = j;
}
}
st.step = ;
printf("%d\n", bfs2());
}
return ;
}

HDU 1254的更多相关文章

  1. O - 推箱子 HDU - 1254(bfs_box + bfs_man)

    O - 推箱子 HDU - 1254 推箱子是一个很经典的游戏.今天我们来玩一个简单版本.在一个M*N的房间里有一个箱子和一个搬运工,搬运工的工作就是把箱子推到指定的位置,注意,搬运工只能推箱子而不能 ...

  2. HDU 1254 推箱子 BFS

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1254 题目分析: 做这道题,感觉挺简单的,做着做着就错了20次, 我也是醉了, WA到吐的节奏啊! 思 ...

  3. HDU 1254 推箱子游戏(搞了一下午。。。)

    中文题目:http://acm.hdu.edu.cn/showproblem.php?pid=1254 一开始常规的人用来做主导,想着想着不对劲,其实是箱子为主导,人只是箱子能否推进的一个判断. 可以 ...

  4. hdu 1254 推箱子(搜索)

    我写的第一道感觉比较难的搜索 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1254 首先要推箱子的话要满足人能够在箱子旁边,而且人的对面也是可通的. ...

  5. hdu 1254(两个BFS) 推箱子

    http://acm.hdu.edu.cn/showproblem.php?pid=1254 首先,要判断人是不是可以从4到达箱子的位置2,而且不止判断一次,因为推动箱子一步后,人的位置也会改变,所以 ...

  6. HDU 1254 推箱子(BFS加优先队列)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1254 推箱子 Time Limit: 2000/1000 MS (Java/Others)    Me ...

  7. hdu - 1254 推箱子 (bfs+bfs)

    http://acm.hdu.edu.cn/showproblem.php?pid=1254 题目意思很简单,只要思路对就好. 首先考虑搬运工能否到达推箱子的那个点,这个可以根据箱子前进方向得出搬运工 ...

  8. hdu.1254.推箱子(bfs + 优先队列)

    推箱子 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submis ...

  9. [HDU 1254] 推箱子

    推箱子 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submis ...

随机推荐

  1. apache 一域名下多个二级域名如何做设置?

    域名最新配置说明官网:http://apache.chinahtml.com/ 目的是在根目录,不同子域名可以访问不同目录下的网站: 第一步:打开 C:\Windows\System32\driver ...

  2. winform在不同电脑分辨率

    private void InitializeComponent() { //设定按字体来缩放控件 this.AutoScaleMode = System.Windows.Forms.AutoScal ...

  3. css width="100" style ="width:100px" 区别

    1. width="100"是正确的,而 width="100px"是错误的, style = "width:100px"是正确的 2. s ...

  4. R之data.table -melt/dcast(数据合并和拆分)

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 30.0px "Helvetica Neue"; color: #323333 } p. ...

  5. [问题2015S09] 复旦高等代数 II(14级)每周一题(第十教学周)

    [问题2015S09]  设 \(A,B\) 是 \(n\) 阶复矩阵, 满足 \(\mathrm{rank}(AB-BA)\leq 1\), 证明: \(A,B\) 可同时上三角化. 问题解答请在以 ...

  6. 【转】CentOS下载版本介绍

    官网:http://www.centos.org/ 下载:http://mirror.neu.edu.cn/centos/6.6/isos/ 系统运维:http://www.osyunwei.com/ ...

  7. Google Protocol Buffer的安装与.proto文件的定义

    什么是protocol Buffer呢? Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准. 我理解的就是:它是一种轻便高效的结构 ...

  8. mysql 命令(一)

    1. 函数向日期添加指定的时间间隔 DATE_ADD(date,INTERVAL expr type)eg:DATE_ADD(CURDATE(),INTERVAL 1 MONTH) //在当前时间加一 ...

  9. html,css,js加载顺序

    1.js放在head中会立即执行,阻塞后续的资源下载与执行.因为js有可能会修改dom,如果不阻塞后续的资源下载,dom的操作顺序不可控. 正常的网页加载流程是这样的. 浏览器一边下载HTML网页,一 ...

  10. [原创] WINDOWS 7 精简教程之驱动精简 可用于64和32

    追风神话 发表于 2014-9-1 11:35:56   https://www.itsk.com/forum.php?mod=viewthread&tid=334491&highli ...