HDU1254 推箱子(BFS) 2016-07-24 14:24 86人阅读 评论(0) 收藏
推箱子
Problem Description
现在给定房间的结构,箱子的位置,搬运工的位置和箱子要被推去的位置,请你计算出搬运工至少要推动箱子多少格.

Input
Output
Sample Input
1
5 5
0 3 0 0 0
1 0 1 4 0
0 0 1 0 0
1 0 2 0 0
0 0 0 0 0
Sample Output
4
————————————————————————————————————————————
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std; int dir[4][2] = { { -1, 0 }, { 0, 1 }, { 0, -1 }, { 1, 0 } };
int mp[10][10];
int vir[10][10][10][10];
int m, n;
struct node{
int bx, by;
int rx, ry;
int cnt;
};
struct man{
int x, y;
}; bool check(int i, int j)
{
if (i<1 || i>m || j<1 || j>n || mp[i][j] == 1)
return 0;
return 1;
} int bfs2(int si, int sj, int di, int dj, int bi, int bj)
{
int vis[10][10];
memset(vis, 0, sizeof(vis));
queue<man>qu;
man st, ed;
st.x = si;
st.y = sj;
vis[si][sj] = 1;
qu.push(st);
while (!qu.empty())
{
st = qu.front();
qu.pop();
if (st.x == di&&st.y == dj)
return 1;
for (int i = 0; i < 4; i++)
{
ed.x = st.x + dir[i][0];
ed.y = st.y + dir[i][1];
if (check(ed.x, ed.y)&& !vis[ed.x][ed.y]&& (ed.x != bi||ed.y != bj))
{
vis[ed.x][ed.y] = 1;
qu.push(ed);
}
}
}
return 0;
} int bfs(int bi, int bj, int ri, int rj, int di, int dj)
{
queue<node>q;
node f, d;
f.bx = bi;
f.by = bj;
f.rx = ri;
f.ry = rj;
f.cnt = 0;
vir[bi][bj][ri][rj] = 1;
q.push(f);
while (!q.empty())
{
f = q.front();
q.pop();
if (f.bx == di&&f.by == dj)
return f.cnt;
for (int i = 0; i<4; i++)
{
d.bx = f.bx + dir[i][0];
d.by = f.by + dir[i][1];
d.rx = f.bx - dir[i][0];
d.ry = f.by - dir[i][1];
if (check(d.bx, d.by)&&check(d.rx,d.ry) && !vir[d.bx][d.by][d.rx][d.ry])
{ if (bfs2(f.rx, f.ry, d.rx, d.ry, f.bx, f.by))
{
vir[d.bx][d.by][d.rx][d.ry] = 1;
d.cnt = f.cnt + 1;
q.push(d);
}
}
}
}
return -1;
} int main()
{
int o, ri, rj, di, dj, bi, bj;
scanf("%d", &o);
while (o--)
{
scanf("%d%d", &m, &n);
for (int i = 1; i<=m; i++)
for (int j = 1; j<=n; j++)
{
scanf("%d", &mp[i][j]);
if (mp[i][j] == 4)
{
ri = i;
rj = j;
}
if (mp[i][j] == 2)
{
bi = i;
bj = j;
}
if (mp[i][j] == 3)
{
di = i;
dj = j;
}
}
int ans = bfs(bi, bj, ri, rj, di, dj);
memset(vir, 0, sizeof(vir));
printf("%d\n", ans); }
return 0;
}
HDU1254 推箱子(BFS) 2016-07-24 14:24 86人阅读 评论(0) 收藏的更多相关文章
- HDU1072 Nightmare(BFS) 2016-07-24 14:02 40人阅读 评论(0) 收藏
Nightmare Problem Description Ignatius had a nightmare last night. He found himself in a labyrinth w ...
- HDU1372 Knight Moves(BFS) 2016-07-24 14:50 69人阅读 评论(0) 收藏
Knight Moves Problem Description A friend of you is doing research on the Traveling Knight Problem ( ...
- iOS正则表达式 分类: ios技术 2015-07-14 14:00 35人阅读 评论(0) 收藏
一.什么是正则表达式 正则表达式,又称正规表示法,是对字符串操作的一种逻辑公式.正则表达式可以检测给定的字符串是否符合我们定义的逻辑,也可以从字符串中获取我们想要的特定部分.它可以迅速地用极简单的方式 ...
- Hdu2181 哈密顿绕行世界问题 2017-01-18 14:46 45人阅读 评论(0) 收藏
哈密顿绕行世界问题 Time Limit : 3000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Sub ...
- Hdu2102 A计划 2017-01-18 14:40 60人阅读 评论(0) 收藏
A计划 Time Limit : 3000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Submissio ...
- Hadoop入门经典:WordCount 分类: A1_HADOOP 2014-08-20 14:43 2514人阅读 评论(0) 收藏
以下程序在hadoop1.2.1上测试成功. 本例先将源代码呈现,然后详细说明执行步骤,最后对源代码及执行过程进行分析. 一.源代码 package org.jediael.hadoopdemo.wo ...
- Lucene学习总结之四:Lucene索引过程分析 2014-06-25 14:18 884人阅读 评论(0) 收藏
对于Lucene的索引过程,除了将词(Term)写入倒排表并最终写入Lucene的索引文件外,还包括分词(Analyzer)和合并段(merge segments)的过程,本次不包括这两部分,将在以后 ...
- MS SQL数据批量备份还原(适用于MS SQL 2005+) 分类: SQL Server 数据库 2015-03-10 14:32 103人阅读 评论(0) 收藏
我们知道通过Sql代理,可以实现数据库的定时备份功能:当数据库里的数据库很多时,备份一个数据库需要建立对应的定时作业,相对来说比较麻烦: 还好,微软自带的osql工具,比较实用,通过在命令行里里输入命 ...
- A Plug for UNIX 分类: POJ 图论 函数 2015-08-10 14:18 2人阅读 评论(0) 收藏
A Plug for UNIX Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 14786 Accepted: 4994 Desc ...
随机推荐
- git cherry-pick基本使用
git cherry-pick可以选择某一分支中的一个或几个commit来进行操作--commit 使用场景: 稳定版本分支1与开发版本分支2,不能直接把两个分支合并,否则会导致版本混乱,要将分支2中 ...
- List<?>和List<T>的区别
是java泛型的两种用法:List<T>是泛型方法,List<?>是限制通配符 List<T>一般有两种用途:1.定义一个通用的泛型方法.伪代码: public i ...
- JDA 8.0.0.0小版本升级
一.升级前关服务和进行备份 二.开始升级 三. 开以下四个服务 1237 四个服务开启后需重新执行SSIS中的startingFP(去掉backupdata 05 importFP) 当以下值为0,代 ...
- Python iter() 函数
Python iter() 函数 Python 内置函数 描述 iter() 函数用来生成迭代器. 语法 以下是 iter() 方法的语法: iter(object[, sentinel]) 参数 ...
- 神龟快跑,2016做的一款UWP游戏
神龟快跑,2016做的一款UWP游戏, 实际是H5页面, 用LAYA转AS3得到的 安装地址 https://www.microsoft.com/zh-cn/store/p/神龟快跑/9nblggh4 ...
- Median(二分+二分)
Median http://poj.org/problem?id=3579 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 1 ...
- 转)Ubuntu14安装wireshark进行抓包
转自:http://jingyan.baidu.com/article/c74d60009d992f0f6a595de6.html 背景: ubuntu14.04/64位 为了抓包和分析包 安装过程: ...
- oracle基本查询入门(二) 子查询
一.子查询语法 SELECT select_list FROM table WHERE expr operator (SELECT select_list FROM table); 子查询在主查询之前 ...
- https://www.w3.org/
W3C W3C By Region All Australia Österreich (Austria) België (Belgium) Botswana Brasil (Brazil) 中国 ...
- 大乐透 Java随机码
package suijishu; import java.util.Random; // TODO Auto-generated method stub public class Xuanqi { ...