题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3085

思路:双向广搜,每次从M出发,搜三步,从G出发,搜一步,然后就是判断是否走到对方已经走过的格子,至于魔王的判断,可以用曼哈顿距离。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
#define MAXN 1000 struct Node{
int x,y;
Node(){}
Node(int xx,int yy):x(xx),y(yy){};
}mm,gg,zz[]; bool mark[MAXN][MAXN][];
int n,m,step;
char map[MAXN][MAXN];
int dir[][]={{-,},{,},{,-},{,}};
queue<pair<int,int> >que[]; bool Judge(int x,int y)
{
if(x>=&&x<n&&y>=&&y<m&&map[x][y]!='X'){
for(int i=;i<;i++){
if((abs(x-zz[i].x)+abs(y-zz[i].y))<=*step)return false;
}
return true;
}
return false;
} bool bfs(int num)
{
int size=que[num].size();
while(size--){
int x=que[num].front().first;
int y=que[num].front().second;
que[num].pop();
if(!Judge(x,y))continue;
for(int i=;i<;i++){
int xx=x+dir[i][];
int yy=y+dir[i][];
if(Judge(xx,yy)){
if(!mark[xx][yy][num]){
if(mark[xx][yy][num^])return true;
mark[xx][yy][num]=true;
que[num].push(make_pair(xx,yy));
}
}
}
}
return false;
} int Solve()
{
memset(mark,false,sizeof(mark));
while(!que[].empty())que[].pop();
while(!que[].empty())que[].pop();
que[].push(make_pair(mm.x,mm.y));
que[].push(make_pair(gg.x,gg.y));
mark[mm.x][mm.y][]=mark[gg.x][gg.y][]=true;
step=;
while(!que[].empty()||!que[].empty()){
step++;
if(bfs())return step;//mm要搜三步
if(bfs())return step;
if(bfs())return step;
if(bfs())return step;
}
return -;
} int main()
{
int _case,index;
scanf("%d",&_case);
while(_case--){
scanf("%d%d",&n,&m);
index=;
for(int i=;i<n;i++){
scanf("%s",map[i]);
for(int j=;j<m;j++){
if(map[i][j]=='M')mm=Node(i,j);
else if(map[i][j]=='G')gg=Node(i,j);
else if(map[i][j]=='Z')zz[index++]=Node(i,j);
}
}
printf("%d\n",Solve());
}
return ;
}

hdu 3085(双向bfs)的更多相关文章

  1. HDU - 3085 双向BFS + 技巧处理 [kuangbin带你飞]专题二

    题意:有两只鬼,一个男孩女孩被困在迷宫中,男孩每秒可以走三步,女孩只能1步,鬼可以两步且可以通过墙.问男孩女孩是否可以在鬼抓住他们之前会合? 注意:每秒开始鬼先移动,然后两人开始移动. 思路:以男孩和 ...

  2. Eight HDU - 1043 (双向BFS)

    记得上人工智能课的时候老师讲过一个A*算法,计算估价函数(f[n]=h[n]+g[n])什么的,感觉不是很好理解,百度上好多都是用逆向BFS写的,我理解的逆向BFS应该是从终点状态出发,然后把每一种状 ...

  3. HDU 3085 Nightmare II 双向bfs 难度:2

    http://acm.hdu.edu.cn/showproblem.php?pid=3085 出的很好的双向bfs,卡时间,普通的bfs会超时 题意方面: 1. 可停留 2. ghost无视墙壁 3. ...

  4. HDU 3085 Nightmare Ⅱ(双向BFS)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3085 题目大意:给你一张n*m地图上,上面有有 ‘. ’:路 ‘X':墙 ’Z':鬼,每秒移动2步,可 ...

  5. HDU 3085 Nightmare Ⅱ (双向BFS)

    Nightmare Ⅱ Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  6. HDU 3085 Nightmare Ⅱ 双向BFS

    题意:很好理解,然后注意几点,男的可以一秒走三步,也就是三步以内的都可以,鬼可以穿墙,但是人不可以,鬼是一次走两步 分析:我刚开始男女,鬼BFS三遍,然后最后处理答案,严重超时,然后上网看题解,发现是 ...

  7. 2017多校第10场 HDU 6171 Admiral 双向BFS或者A*搜索

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6171 题意: 给你一个高度为6的塔形数组,你每次只能将0与他上下相邻的某个数交换,问最少交换多少次可以 ...

  8. HDU 1043 Eight(双向BFS+康托展开)

    http://acm.hdu.edu.cn/showproblem.php?pid=1043 题意:给出一个八数码,求出到达指定状态的路径. 思路:路径寻找问题.在这道题里用到的知识点挺多的.第一次用 ...

  9. HDU 1242 -Rescue (双向BFS)&amp;&amp;( BFS+优先队列)

    题目链接:Rescue 进度落下的太多了,哎╮(╯▽╰)╭,渣渣我总是埋怨进度比别人慢...为什么不试着改变一下捏.... 開始以为是水题,想敲一下练手的,后来发现并非一个简单的搜索题,BFS做肯定出 ...

随机推荐

  1. linux内核——进程切换宏switch_to

    该宏有三个参数:prev, next, last.它们都是局部变量. prev:输入参数,变量值为旧进程描述符的地址. next:输入参数,变量值为新进程描述符的地址. last:输出参数,用来记录该 ...

  2. iOS开发- 隐藏键盘总结

    一.隐藏自身软键盘 当对于有多个UITextField控件都想通过点击"Return"来隐藏自身软键盘的情况.这时的最好办法是使用Did End on Exit事件.在点击软键盘右 ...

  3. HTTP 错误状态码讯息

    HTTP 错误讯息解读   4xx: Client Error 使用者端(浏览器)错误讯息 错误码   错误讯息说明 400 Bad Request    错误的要求 401 Unauthorized ...

  4. 控制器中添加DB类才可以操作数据库表中的数据

    必须使用DB:  use DB;

  5. 破解Aspose 操作pdf word等文档 对10以下版本有效

    using System; using System.IO; namespace LicenseHelper { public static class License { public const ...

  6. jasmine-行为驱动测试

    http://jasmine.github.io/1.3/introduction.html,先保留着,好好研究.

  7. ItelliJ项目打jar包

    不是Eclipse里方便的export...了. 一.配置 . 点击View->Open Module Settings(快捷键是F4) . 在弹出的对话框中,点击最左侧树的Artifacts ...

  8. DevExpress中chartControl中实现统计图功能

    public partial class Form1 : DevExpress.XtraEditors.XtraForm { public Form1() { InitializeComponent( ...

  9. XML文件标签名一致,而属性值不同,如何遍历取值写法 摘录

    <EssentialFunctions>      <Qualification description="We Offer" source="AdDe ...

  10. Java计算两个字符串日期之间的天数差

    Java计算两个字符串日期之间的天数差 调用方法: public static void main(String[] args) throws ParseException { String a = ...