链接:https://ac.nowcoder.com/acm/contest/549/G
来源:牛客网

题目描述

小A与小B这次两个人都被困在了迷宫里面的两个不同的位置,而他们希望能够迅速找到对方,然后再考虑如何逃离迷宫的事情。小A每次可以移动一个位置,而小B每次可以移动两次位置,小A移动的方向是上下左右左上左下右上右下8个方向,小B移动的方向是上下左右4个方向,请问他们最早什么时候能够找到对方,如果他们最终无法相遇,那么就输出”NO"。

输入描述:

第一行两个整数N,M分别表示迷宫的行和列。接下来一个N×M的矩阵其中"C"表示小A的位置,"D"表示小B的的位置,"#"表示不可通过的障碍,"."则是可以正常通过的位置。字符用空格隔开第一行两个整数N,M分别表示迷宫的行和列。接下来一个N×M的矩阵其中"C"表示小A的位置,"D"表示小B的的位置,"#"表示不可通过的障碍,"."则是可以正常通过的位置。字符用空格隔开

输出描述:

如果可以相遇,第一行输出一个YES,第二行一个整数输出最短的相遇时间。
否则就输出一个NO表示不能相遇。
示例1

输入

4 5
. . . . .
. # # # .
. . . # D
. . C # .

输出

YES
3

备注:

1≤n,m≤1000

解题:
首次遇到地图里两个人的,显然用两次bfs,而且其中一个人不是简简单单每次走一步,而是每次走两步,个人感觉变动有点大,驾驭不住,就写了两个bfs函数,我看大牛们一个就够了,用参数解决。
用三维数组表示不同人的走路步数,一边判断是否走过,顺便标记步数。
最后遍历地图,取二者都能走到的位置,取二人步数大者为答案,动态找较大者的最小值。
 #include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<math.h>
#include<string>
#include<queue>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std; struct node
{
int x;
int y;
};
int n,m,ans;
int ax,ay,bx,by,cnt;
char mp[][];
int vis[][][];///判断是否走过,顺便记录走到这一步的步数
int d0[][]={-,-, -,, -,, ,-, ,, ,-, ,, ,};///A的位移
int d1[][]={-,, ,, ,-, ,};///B的位移
queue<node>que[];///0表示A,1表示B void bfs0()
{
while(!que[].empty()) que[].pop();
que[].push( {ax,ay} );
while(!que[].empty())
{
node now=que[].front();
int cnt=vis[][now.x][now.y];///走到这一步的步数
que[].pop();
for(int i=;i<;i++)
{
int xx=now.x+d0[i][];
int yy=now.y+d0[i][];
if( xx>= && xx<=n && yy>= && yy<=m && mp[xx][yy]=='.' && vis[][xx][yy]==- )
{
que[].push( {xx,yy} );
vis[][xx][yy]=cnt+;///位移+1
}
}
}
} void bfs1()
{
while(!que[].empty()) que[].pop();
que[].push( {bx,by} );
while(!que[].empty())
{
node now=que[].front();
que[].pop();
int cnt=vis[][now.x][now.y];
for(int i=;i<;i++)///第一步
{
int xx=now.x+d1[i][];
int yy=now.y+d1[i][];
if(xx>= && xx<=n && yy>= && yy<=m && mp[xx][yy]=='.' && vis[][xx][yy]==- )
{
vis[][xx][yy]=cnt+;///第一步也要记录位移次数,与第二步的次数一样
for(int j=;j<;j++)///第二步在if大括号里,否则会窗墙
{
int tx=xx+d1[j][];
int ty=yy+d1[j][]; if( tx>= && tx<=n && ty>= && ty<=m && mp[tx][ty]=='.' && vis[][tx][ty]==- )
{
que[].push( {tx,ty} );
vis[][tx][ty]=cnt+;///位移次数+1
}
}
}
}
}
} int main()
{
memset(vis,-,sizeof(vis));
scanf("%d %d",&n,&m);
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
{
cin>>mp[i][j];
if(mp[i][j]=='C') ax=i,ay=j;
if(mp[i][j]=='D') bx=i,by=j;
}
vis[][ax][ay]=;
vis[][bx][by]=;///起点为0
bfs0();
bfs1();
/**打印观察
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
printf("%2d ",vis[0][i][j]);
printf("\n");
}
printf("\n\n");
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
printf("%2d ",vis[1][i][j]);
printf("\n");
}
*/
int ans=inf;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
{
if( vis[][i][j]!=- && vis[][i][j]!=- )
ans = min( max(vis[][i][j],vis[][i][j]), ans );
}
if(ans!=inf)
printf("YES\n%d\n",ans);
else
printf("NO\n");
return ;
}

小A与小B-(双向bfs)的更多相关文章

  1. 小白月赛13 小A与小B (双向BFS)

    链接:https://ac.nowcoder.com/acm/contest/549/G来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言52428 ...

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

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

  3. UVA-1604 Cubic Eight-Puzzle (双向BFS+状态压缩+限制搜索层数)

    题目大意:立体的八数码问题,一次操作是滚动一次方块,问从初始状态到目标状态的最少滚动次数. 题目分析:这道题已知初始状态和目标状态,且又状态数目庞大,适宜用双向BFS.每个小方块有6种状态,整个大方格 ...

  4. HDU 3085 Nightmare Ⅱ(双向BFS)

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

  5. BFS:HDU2612-Find a way(双向BFS)

    Find a way Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

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

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

  7. 双向BFS和启发式搜索的应用

    题目链接 P5507 机关 题意简述   有12个旋钮,每个旋钮开始时处于状态 \(1\) ~ \(4\) ,每次操作可以往规定方向转动一个旋钮 (\(1\Rightarrow2\Rightarrow ...

  8. CF995E Number Clicker (双向BFS)

    题目链接(洛谷) 题目大意 给定两个数 \(u\) , \(v\) .有三种操作: \(u=u+1(mod\) \(p)\) . \(u=u+p−1(mod\) \(p)\) . \(u=u^{p−2 ...

  9. 微信小程序+“芝麻小客服”可设自动关注公众号,助力运营闭环

    微信小程序全面上线已经接近1年的时间,从最初的"用完即走"理念到2017年总计更新开放60余次的功能创新,微信小程序不一定会爆发下一次的红利,但绝对是微信生态中重要的一环. 芝麻小 ...

随机推荐

  1. Faster-RCNN理解

    一.Faster-RCNN基本结构 该网络结构大致分为三个部分:卷积层得到高位图像特征feature maps.Region Proposal Network得到候选边框.classifier识别出物 ...

  2. Getting Started with XlsxWriter

    下面是一些关于使用XlsxWriter模块的简单介绍. 安装XlsxWriter 下面的是几个安装XlsxWriter模块的方法: 1.使用Pip 使用pip 方式是最推荐的从PyPi安装Python ...

  3. Optaplanner终于支持多线程并行运行 - Multithreaded incremental solving

    Optaplanner 7.9.0.Final之前,启动引擎开始对一个Problem进行规划的时候,只能是单线程进行的.也就是说,当引擎对每一个possible solution进行分数计算的过程中, ...

  4. MariaDB——(一)CentOS 6.5 下 MariaDB 10.0.15 YUM 安装

    1.配置yum源: 在MariaDB官网提供了yum源在线生成器,选择合适的系统和版本后,会生成所需的repo文件内容: 在/etc/yum.repos.d/目录下新建一个MariaDB.repo文件 ...

  5. js通过replace()方法配合正则去除空格

    <script> //去掉全部空格 var str = " 546546 4564 46 46 88 88 "; var str = str.replace(/\s+/ ...

  6. 7.11 animals.c 程序

    7.11 animals.c 程序 #include <stdio.h> #include <ctype.h> int main(void) { char ch; printf ...

  7. pyexecjs模块

    1,找到断点事件 2,浏览call stack 下面的代码,找到需要的值 3,F11进入方法内部 对于网站自己定义的方法,可以用py复制下来进行执行js N = function (a, b, c) ...

  8. spring从服务器磁盘读取图片,然后显示于前端页面上

    需求是,前台通过传参,确定唯一图片,然后后台在服务器磁盘中读取该图片,然后显示于前台页面上. 后台代码: @RequestMapping("unit/bill/showeinvoice&qu ...

  9. Jq写个联级菜单

    这个效果很好看,Jq很容易实现: $(document).ready(function(){ $('.menu li').hover(function(){ $(this).children('ul' ...

  10. jquery中对小数进行取整

    var uu=Math.floor(5.36) 向下取整 结果为5 var uu=Math.floor(5.88) 结果为5 Math.ceil(5.33) 向上取整,结果为6 Math.round( ...