小A与小B-(双向bfs)
链接:https://ac.nowcoder.com/acm/contest/549/G
来源:牛客网
题目描述
输入描述:
第一行两个整数N,M分别表示迷宫的行和列。接下来一个N×M的矩阵其中"C"表示小A的位置,"D"表示小B的的位置,"#"表示不可通过的障碍,"."则是可以正常通过的位置。字符用空格隔开第一行两个整数N,M分别表示迷宫的行和列。接下来一个N×M的矩阵其中"C"表示小A的位置,"D"表示小B的的位置,"#"表示不可通过的障碍,"."则是可以正常通过的位置。字符用空格隔开
输出描述:
如果可以相遇,第一行输出一个YES,第二行一个整数输出最短的相遇时间。
否则就输出一个NO表示不能相遇。
输入
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)的更多相关文章
- 小白月赛13 小A与小B (双向BFS)
链接:https://ac.nowcoder.com/acm/contest/549/G来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言52428 ...
- HDU 1043 Eight(双向BFS+康托展开)
http://acm.hdu.edu.cn/showproblem.php?pid=1043 题意:给出一个八数码,求出到达指定状态的路径. 思路:路径寻找问题.在这道题里用到的知识点挺多的.第一次用 ...
- UVA-1604 Cubic Eight-Puzzle (双向BFS+状态压缩+限制搜索层数)
题目大意:立体的八数码问题,一次操作是滚动一次方块,问从初始状态到目标状态的最少滚动次数. 题目分析:这道题已知初始状态和目标状态,且又状态数目庞大,适宜用双向BFS.每个小方块有6种状态,整个大方格 ...
- HDU 3085 Nightmare Ⅱ(双向BFS)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3085 题目大意:给你一张n*m地图上,上面有有 ‘. ’:路 ‘X':墙 ’Z':鬼,每秒移动2步,可 ...
- BFS:HDU2612-Find a way(双向BFS)
Find a way Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- HDU 1242 -Rescue (双向BFS)&&( BFS+优先队列)
题目链接:Rescue 进度落下的太多了,哎╮(╯▽╰)╭,渣渣我总是埋怨进度比别人慢...为什么不试着改变一下捏.... 開始以为是水题,想敲一下练手的,后来发现并非一个简单的搜索题,BFS做肯定出 ...
- 双向BFS和启发式搜索的应用
题目链接 P5507 机关 题意简述 有12个旋钮,每个旋钮开始时处于状态 \(1\) ~ \(4\) ,每次操作可以往规定方向转动一个旋钮 (\(1\Rightarrow2\Rightarrow ...
- CF995E Number Clicker (双向BFS)
题目链接(洛谷) 题目大意 给定两个数 \(u\) , \(v\) .有三种操作: \(u=u+1(mod\) \(p)\) . \(u=u+p−1(mod\) \(p)\) . \(u=u^{p−2 ...
- 微信小程序+“芝麻小客服”可设自动关注公众号,助力运营闭环
微信小程序全面上线已经接近1年的时间,从最初的"用完即走"理念到2017年总计更新开放60余次的功能创新,微信小程序不一定会爆发下一次的红利,但绝对是微信生态中重要的一环. 芝麻小 ...
随机推荐
- 浅谈SPI总线
SPI总线概述 SPI全称是串行外设接口(Serial Peripheral Interface),是由Motorola提出的一种全双工同步串行通信接口,通信波特率可以高达5Mbps,但具体速 ...
- linux如何查看某个端口接收到的数据
lsof -i:11883 可以获得 端口的连接信息 用这个可以按照端口查看详细的收发数据 sudo tcpdump -A -s 0 'tcp port 11883 and (((ip[2:2] - ...
- PhpStorm 2018 破解方法
破解方法如下: 1.修改phpstrom的验证服务器地址. 在C:\Windows\System32\drivers\etc目录下打开hosts文件,并在文件最后加入 0.0.0.0 account. ...
- oracle死锁的处理办法
摘自:https://www.cnblogs.com/xuke/p/4053396.html http://blog.itpub.net/30036720/viewspace-2121034/ ora ...
- JavaScript BOM和DOM
Browser Object Model BOM是所有JavaScript的核心,所有的功能其实都建立在BOM基础之上.各浏览器提供的BOM的功能存在很大差异,BOM在HTML5中已经有很大一部分被放 ...
- Docker基础操作
安装 ubuntu16.04安装docker sudo apt-get update sudo apt-get install docker sudo apt-get install docker.i ...
- sql 查询结果转百分比
select convert(varchar,convert(decimal(10,2),迟到人次*1.0/在校生人数*100))+'%'
- udev磁盘绑定
udev磁盘绑定 [grid@db-rac02 ~]$ cat 99-asm-multipath.rules KERNEL=="sd*",SUBSYSTEM=="bloc ...
- [java,2017-05-17] 数据型参数趣谈
int的最大值是多少?加一呢?乘2呢? 第一个问题我想大多数人都知道,不知道后两个有多少人研究过. 首先上一段代码: public class DecimalTest { public static ...
- k8s创建pod流程
kubernetes 创建Pod 的 工作流: step.1 kubectl 向 k8s api server 发起一个create pod 请求(即我们使用Kubectl敲一个create pod命 ...