BFS:HDU3085-Nightmare Ⅱ(双向BFS)
Nightmare Ⅱ
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 886
Accepted Submission(s): 185
Problem Description
his girl friend before the ghosts find them.
You may suppose that little erriyue and his girl friend can move in 4 directions. In each second, little erriyue can move 3 steps and his girl friend can move 1 step. The ghosts are evil, every second they will divide into several parts to occupy the grids
within 2 steps to them until they occupy the whole maze. You can suppose that at every second the ghosts divide firstly then the little erriyue and his girl friend start to move, and if little erriyue or his girl friend arrive at a grid with a ghost, they
will die.
Note: the new ghosts also can devide as the original ghost.
Each test case starts with a line contains two integers n and m, means the size of the maze. (1<n, m<800)
The next n lines describe the maze. Each line contains m characters. The characters may be:
‘.’ denotes an empty place, all can walk on.
‘X’ denotes a wall, only people can’t walk on.
‘M’ denotes little erriyue
‘G’ denotes the girl friend.
‘Z’ denotes the ghosts.
It is guaranteed that will contain exactly one letter M, one letter G and two letters Z.
5 6
XXXXXX
XZ..ZX
XXXXXX
M.G...
......
5 6
XXXXXX
XZZ..X
XXXXXX
M.....
..G...
10 10
..........
..X.......
..M.X...X.
X.........
.X..X.X.X.
.........X
..XX....X.
X....G...X
...ZX.X...
...Z..X..X
1
-1
n*m地图上有
‘. ’:路
‘X':墙
’Z':鬼,每秒蔓延2个单位长度,可以穿墙,共两个,每秒开始时鬼先动
‘M’:一号,每分钟可移动3个单位长度
‘G’:二号,每分钟课移动1个单位长度
#include<bits/stdc++.h>
using namespace std;
const int maxn = 880;
int n,m;
int dir[4][2] = {1,0,-1,0,0,1,0,-1};
char maps[maxn][maxn];
struct node
{
int x,y;
} now,Next,b,g,z[2];
queue <node> q[2],qt;//q[0]为boy,q[1]为girl,qt为当前操作的队列
int step = 0;
void pre_maps()
{
//多组输入,清零
while(!q[0].empty())
q[0].pop();
while(!q[1].empty())
q[1].pop();
while(!qt.empty())
qt.pop(); int k = 0;
for(int i=0; i<n; i++)
scanf("%s",maps[i]);
for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
{
if(maps[i][j] == 'Z')
{
z[k].x = i;
z[k].y = j;
k++;
}
if(maps[i][j] == 'M')
{
b.x = i;
b.y = j;
}
if(maps[i][j] == 'G')
{
g.x = i;
g.y = j;
}
}
} bool check(node a)
{
if(a.x <0 || a.y <0 || a.x >= n || a.y >= m)//超出地图直接返回
return true;
for(int i=0; i<2; i++)
{
if(maps[a.x][a.y] == 'X' || (abs(a.x-z[i].x)+abs(a.y-z[i].y)) <= 2*step)//是墙,或者被鬼抓到返回
return true;
}
return false;
}
bool bfs(int k,int num,char start,char End)
{
qt = q[k];//用来表示当前层的搜索,队列也可以直接赋值
for(int i=0; i<num; i++)
{
while(!qt.empty())
{
now = qt.front();
qt.pop();
q[k].pop();
if(check(now)) continue;
for(int j=0; j<4; j++)
{
Next.x = now.x + dir[j][0];
Next.y = now.y + dir[j][1];
if(check(Next)) continue;
if(maps[Next.x][Next.y] == start) continue;//已经走过了
if(maps[Next.x][Next.y] == End)//两个bfs相遇
return true;
maps[Next.x][Next.y] = start;//走过的地点直接标记
q[k].push(Next);
}
}
qt = q[k];//将下一层的队列赋值给当前层
}
return false;
} int solve()
{
bool flag1 = false,flag2 = false;
step = 0;
q[0].push(b);
q[1].push(g);
while(!q[0].empty() && !q[1].empty())
{
step++; flag1 = bfs(0,3,'M','G');//boy的bfs
flag2 = bfs(1,1,'G','M');//girl的bfs
if(flag1 || flag2)//当有一方相遇了
return step;
}
return -1;//没有找到
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
pre_maps();
printf("%d\n",solve());
}
}
BFS:HDU3085-Nightmare Ⅱ(双向BFS)的更多相关文章
- HDU3085 Nightmare Ⅱ —— 双向BFS + 曼哈顿距离
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3085 Nightmare Ⅱ Time Limit: 2000/1000 MS (Java/Other ...
- HDU3085 Nightmare Ⅱ (双向BFS)
联赛前该练什么?DP,树型,状压当然是爆搜啦 双向BFS就是两个普通BFS通过一拼接函数联系,多多判断啦 #include <iostream> #include <cstdio&g ...
- POJ 1915-Knight Moves (单向BFS && 双向BFS 比)
主题链接:Knight Moves 题意:8个方向的 马跳式走法 ,已知起点 和终点,求最短路 研究了一下双向BFS,不是非常难,和普通的BFS一样.双向BFS只是是从 起点和终点同一时候開始搜索,可 ...
- HDU 3085 Nightmare Ⅱ (双向BFS)
Nightmare Ⅱ Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- HDU3085(双向BFS+曼哈顿距离)题解
Nightmare Ⅱ Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- HDU 3085 Nightmare Ⅱ 双向BFS
题意:很好理解,然后注意几点,男的可以一秒走三步,也就是三步以内的都可以,鬼可以穿墙,但是人不可以,鬼是一次走两步 分析:我刚开始男女,鬼BFS三遍,然后最后处理答案,严重超时,然后上网看题解,发现是 ...
- HDU3085(KB2-G 双向bfs)
Nightmare Ⅱ Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- HDU——1195Open the Lock(双向BFS)
Open the Lock Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...
- Nightmare Ⅱ(双向BFS)
Problem Description Last night, little erriyue had a horrible nightmare. He dreamed that he and his ...
随机推荐
- windows系统下同时启动三台Tomcat服务的配置&并设置开机启动服务
1.tomcat 7.0.82下载地址:链接:https://pan.baidu.com/s/1i51pAgl 密码:mxol 2.解压apache-tomcat-7.0.82-windows-x64 ...
- cmd对其他盘符进行操作
一般我们打开cmd命令时,会出现如下界面: 现在,我想要对g盘进行操作,则输入 --> g:,然后回车,如图: 可以查看一下g盘下的所有子目录,输入 --> dir,回车,结果如下: 我想 ...
- java 基础 02 数据类型、运算符、分支结构
内容: (1)数据类型 (2)运算符 (3)分支结构 1.数据类型 java语言中的基本数据类型:byte.short.int.long.float.double.boolean.char. 1.1布 ...
- linux 跳过登陆修改用户密码
2017-02-11 20:41 6人阅读 评论(0) 收藏 编辑 删除 分类: Linux 版权声明:本文为博主原创文章,未经博主允许不得转载. Linux 系统默认的是有0 1 2 3 ...
- 使用create react app教程
This project was bootstrapped with Create React App. Below you will find some information on how to ...
- MATLAB之折线图、柱状图、饼图以及常用绘图技巧
MATLAB之折线图.柱状图.饼图以及常用绘图技巧 一.折线图 参考代码: %图1:各模式直接成本预测 %table0-table1为1*9的数组,记录关键数据 table0 = data_modol ...
- 爱加密so保护简单脱壳测试
1. 最近研究so文件的保护,在网上搜索发现爱加密支持对so文件的保护,然后联系客户,本来是想让客户保护一个自己的so文件来做测试的,结果客户各种不愿意,说要签什么XX协议后才能给so保护,各种蛋 ...
- 初识ListView - 定制ListView - 提升ListView运行效率
ListView绝对可以称得上是 Android 中最常用的控件之一,几乎所有的应用程序都会用到它.由于手机屏幕空间都比较有限,能够一次性在屏幕上显示的内容并不多,当我们的程序中有大量的数据需要展示的 ...
- 制作centos安装u盘
格式化 mkfs.vfat /dev/sdb1 制作 dd if=CentOS-7-x86_64-Minimal-1503-01.iso of=/dev/sdb # 1. 注意是/dev/sdb 不是 ...
- LeetCode Rotate Array 翻转数组
题意:给定一个数组,将该数组的后k位移动到前n-k位之前.(本题在编程珠玑中第二章有讲) 思路: 方法一:将后K位用vector容器装起来,再移动前n-k位到后面,再将容器内k位插到前面. class ...