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 ...
随机推荐
- scala -- 层级
层级 层级的顶端是Any 类,定义了如下方法 final def ==(that:Any):Boolean final def !=(that:Any):Boolean def equals(that ...
- C# 窗口页面卡的处理方案-异步编程委托
今天用winform做了一个小程序,主要是用于远程数据的登录采集,因为数据量非常大,到时每次点击按钮执行程序的时候界面都会出现假死状态,具体表现是无法拖动窗口,无法最小化或关闭等,只能任务管理进程结束 ...
- git冲突解决方案 Intellij IDEA
一般在团队合作开发一个项目的过程中,经常出现两个人同时修改一个文件然后都向主master提交commit,这样就会产生冲突(conflict),那么这种情况如何解决? 1 新建分支 如果项目的主分支是 ...
- sql重复数据只取一条记录
1.SQL SELECT DISTINCT 语句 在表中,可能会包含重复值.这并不成问题,不过,仅仅列出不同(distinct)的值. 关键词 DISTINCT 用于返回唯一不同的值. 语法: SEL ...
- 安装tftp服务器进行文件传输
1. 安装: sudo apt-get install tftp-hpa tftpd-hpa ps: tftpd是服务器,tftp是客户端,客户端能发送和获取,服务器不能动. 2. 配置文件: sud ...
- Volley下载图片存放在data/data下 networkImageView lrucache
networkImageView 设置图片的方法 (有效) imageView.setImageUrl("https://www.baidu.com/img/bd_logo1.png&qu ...
- MQ java 基础编程
MQ java 基础编程 编写人:邬文俊 编写时间 : 2006-2-16 联系邮件 : wenjunwu430@gmail.com 前言 通过 2 个多星期对 MQ 学习,在 partner 丁 & ...
- php的opcode缓存原理
opcode是什么? 它是一种PHP脚本编译后的中间语言,类似java的字节码. PHP代码执行(Zend引擎)的步骤如下: 1.Scanning(Lexing) ,将PHP代码转换为语言片段(T ...
- phpcms与discuz的ucenter整合
1.安装phpcms系统,域名为pc.me 2.安装discuz,并选择安上uc_server,域名为dz.me 3.在phpcms下phpsso的系统设置 4.到ucenter管理中心- ...
- Newtonsoft.Json自动升级版本号,导致dll冲突
不知道怎么回事,vs偶尔会自动升级Newtonsoft.Json.dll的版本号,但是又不升级dll,仅仅是版本号变了,实际引用的dll还是原来的. 我用的是6.0.0的,然后版本号升级成了7.0.0 ...