HDU 3085 双广
n*m地图上有
‘. ’:路
‘X':墙
’Z':鬼,每秒蔓延2个单位长度,能够穿墙。共两个,每秒開始时鬼先动
‘M’:一号,每分钟可移动3个单位长度
‘G’:二号,每分钟课移动1个单位长度
问两人能否够成功碰面,再不被鬼吃掉的前提下
双向广搜。对于‘M’。每次搜三步,对于‘G’,每次搜一步。和鬼的距离可用曼哈顿距离计算推断
注意每秒開始时鬼先移动
#include "stdio.h"
#include "string.h"
#include "algorithm"
#include "queue"
using namespace std; const int dir[4][2]={ {1,0},{-1,0},{0,1},{0,-1} };
char str[810][810];
int used[2][810][810];
int g_x,g_y,m_x,m_y,n,m,step; struct node
{
int x,y;
}ncur,z[2]; queue<node>q[2]; void init()
{
int i,j,cnt;
scanf("%d%d",&n,&m);
for (i=0;i<n;i++)
scanf("%s",str[i]);
cnt=0;
for (i=0;i<n;i++)
for (j=0;j<m;j++)
{
if (str[i][j]=='G')
{
g_x=i; g_y=j;
}
if (str[i][j]=='M')
{
m_x=i; m_y=j;
}
if (str[i][j]=='Z')
{
z[cnt].x=i;
z[cnt++].y=j;
}
}
} int judge(node b)
{
if (b.x<0 || b.y<0 || b.x>=n || b.y>=m) return 0;
if (str[b.x][b.y]=='X') return 0;
if ((abs(b.x-z[0].x)+abs(b.y-z[0].y))<=2*step) return 0;
if ((abs(b.x-z[1].x)+abs(b.y-z[1].y))<=2*step) return 0;
return 1;
} int bfs(int w)
{
node cur,next;
int i,sum; sum=q[w].size();
while (sum--)
{
cur=q[w].front();
q[w].pop();
if (judge(cur)==0) continue;
for (i=0;i<4;i++)
{
next.x=cur.x+dir[i][0];
next.y=cur.y+dir[i][1];
if (judge(next)==0) continue;
if (used[w][next.x][next.y]==0)
{
if (used[w^1][next.x][next.y]==1) return 1;
used[w][next.x][next.y]=1;
q[w].push(next);
}
}
}
return 0;
}
int solve()
{
while (!q[0].empty()) q[0].pop();
while (!q[1].empty()) q[1].pop(); ncur.x=m_x;
ncur.y=m_y;
q[0].push(ncur);
ncur.x=g_x;
ncur.y=g_y;
q[1].push(ncur);
memset(used,0,sizeof(used));
used[0][m_x][m_y]=used[1][g_x][g_y]=1;
step=0; while ((!q[0].empty()) || (!q[1].empty()))
{
step++;
if (bfs(0)==1) return step;
if (bfs(0)==1) return step;
if (bfs(0)==1) return step;
if (bfs(1)==1) return step;
}
return -1; }
int main()
{
int Case;
scanf("%d",&Case);
while (Case--)
{
init();
printf("%d\n",solve());
}
return 0;
}
HDU 3085 双广的更多相关文章
- HDU 1403 Eight&POJ 1077(康拖,A* ,BFS,双广)
Eight Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submis ...
- hdu.1043.Eight (打表 || 双广 + 奇偶逆序)
Eight Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...
- hdu 1401(单广各种卡的搜索题||双广秒速)
Solitaire Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total S ...
- HDU 3085 Nightmare Ⅱ(噩梦 Ⅱ)
HDU 3085 Nightmare Ⅱ(噩梦 Ⅱ) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Ja ...
- HDU - 3085 Nightmare Ⅱ
HDU - 3085 Nightmare Ⅱ 双向BFS,建立两个队列,让男孩女孩一起走 鬼的位置用曼哈顿距离判断一下,如果该位置与鬼的曼哈顿距离小于等于当前轮数的两倍,则已经被鬼覆盖 #includ ...
- nyoj 999——师傅又被妖怪抓走了——————【双广搜】
师傅又被妖怪抓走了 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 话说唐僧复得了孙行者,师徒们一心同体,共诣西方.自宝象国救了公主,承君臣送出城西,沿路饥餐渴饮,悟 ...
- hdu 3085(双向bfs)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3085 思路:双向广搜,每次从M出发,搜三步,从G出发,搜一步,然后就是判断是否走到对方已经走过的格子, ...
- HDU 3085 Nightmare II 双向bfs 难度:2
http://acm.hdu.edu.cn/showproblem.php?pid=3085 出的很好的双向bfs,卡时间,普通的bfs会超时 题意方面: 1. 可停留 2. ghost无视墙壁 3. ...
- HDU 3085 Nightmare Ⅱ(双向BFS)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3085 题目大意:给你一张n*m地图上,上面有有 ‘. ’:路 ‘X':墙 ’Z':鬼,每秒移动2步,可 ...
随机推荐
- luogu P1938找工就业
一头牛在一个城市最多只能赚D元,然后它必须到另一个城市工作.当然它可以在别处工作一阵子后,又回到原来的城市再最多赚D美元.而且这样的往返次数没有限制城市间有P条单向路径,共有C座城市,编号1~C,奶牛 ...
- 数学结论【p1463】[POI2002][HAOI2007]反素数
Description 对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4. 如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数.例如,整数 ...
- 简单的INSERT语句
INSERT INTO 语句用来向数据表中插入数据,比如执行下面的语句就可以向T_Person表中插入一条数据: INSERT INTO T_Person(FName,FAge,FRemark) VA ...
- luogu P1009 阶乘之和
题目描述 用高精度计算出S=1!+2!+3!+…+n!(n≤50) 其中“!”表示阶乘,例如:5!=5*4*3*2*1. 输入输出格式 输入格式: 一个正整数N. 输出格式: 一个正整数S,表示计算结 ...
- 【树状数组】Codeforces Round #755 D. PolandBall and Polygon
http://codeforces.com/problemset/problem/755/D 每次新画一条对角线的时候,考虑其跨越了几条原有的对角线. 可以用树状数组区间修改点查询来维护多边形的顶点. ...
- 【二分答案】【最大流】bzoj3130 [Sdoi2013]费用流
二分最大的边的cap,记作Lim. 把所有的边的cap设为min(Lim,cap[i]). Bob一定会把单位费用加到最大边上. #include<cstdio> #include< ...
- 【博弈论】【SG函数】bzoj3404 [Usaco2009 Open]Cow Digit Game又见数字游戏
#include<cstring> #include<cstdio> #include<algorithm> #include<set> using n ...
- golang垃圾回收
常见GC算法 我总结了一下常见的 GC 算法.分别是:引用计数法.Mark-Sweep法.三色标记法.分代收集法. 1. 引用计数法 原理是在每个对象内部维护一个整数值,叫做这个对象的引用计数,当对象 ...
- linux-内存使用-free
解释一下Linux上free命令的输出. 下面是free的运行结果,一共有4行.为了方便说明,我加上了列号.这样可以把free的输出看成一个二维数组FO(Free Output).例如: FO[2][ ...
- [功能]点击ImageView进入页面,时间响应者链实现
app点击一个按钮跳转到另外一个控制器非常常用,但是如果是点击的是UIImageView如何通过模态视图进入另外一个控制器呢?万一这个UIImageView在自定义的cell或者view里面,那该如何 ...