链接: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. python基础知识15---三元表达式、列表推导式、生成器表达式、递归、匿名函数、内置函数

    阅读目录 一 三元表达式.列表推导式.生成器表达式 二 递归与二分法 三 匿名函数 四 内置函数 五 阶段性练习 一. 三元表达式.列表推导式.生成器表达式 1 三元表达式 name=input('姓 ...

  2. Struts2国际化学习笔记

    今天在家里学习了Struts2中的国际化技术,国际化技术其实我的理解就是同一个网站项目或者同一个网页能够自由切换或者自适应本地语言,并根据本地语言进行网页展示. 实现Struts2中的国际化的方法是: ...

  3. SpringCloud启动类指定扫描包路径

    //如果这个启动类所在的包路径隐藏的很深,则需要指定扫描包.否则默认扫描启动类所在的子包路径下 @SpringBootApplication(scanBasePackages="com.jo ...

  4. 微信小程序+没有找到node_modules目录

    第一步:设置-->项目设置-->使用npm模块 第二步:右键目录下miniprogram-->终端打开-->输入npm init-->在packagename下输入:sm ...

  5. day2.jmeter简单压测,下载文件,Charles手机抓包准备

    一.压测 压测衡量一个系统的好坏:1.tps每秒钟处理的事物数,2.qps响应时间 添加聚合报告,更改线程组,运行接口请求 **添加压力机 1.首先确保都在同一网段 2.其他电脑要先启动jmeter- ...

  6. Monkey相关参数 笔记

    Monkey相关参数  笔记 Monkey是Android系统自带的一个命令行工具,可运行在模拟器里或实际设备中. Monkey可以向被测试的应用程序发送伪随机的用户事件流(如按键.触屏.手势等),实 ...

  7. [STM31F103]独立看门狗

    独立看门狗步骤: l 取消寄存器写保护: n IWDG_WriteAccessCmd(); l 设置独立看门狗的预分频系数,确定时钟: n IWDG_SetPrescaler(); l 设置看门狗重装 ...

  8. Verilog风格

    Verilog HDL编写原则: 可移植性强(多用宏定义:少用嵌入代码中的常数,即Magic Number:使用头文件): 必要的注释,代码易读: 模块间耦合尽可能低: 变量名与宏的命名规则: 变量名 ...

  9. JAVA WEB项目中开启流量控制Filter

    Flow Control:控流的概念 主要是用来限定server所能承载的最大(高并发)流量峰值,以免在峰值是Server过载而宕机,对于WEB系统而言 通常是分布式部署,如果请求并发量很大,会导致整 ...

  10. express+websocket+exec+spawn=webshell

    var child_process = require('child_process'); var ws = require("nodejs-websocket"); consol ...