小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余次的功能创新,微信小程序不一定会爆发下一次的红利,但绝对是微信生态中重要的一环. 芝麻小 ...
随机推荐
- java 乱码问题集
场景1:刚复制来的java类乱码,反复修改无果 解:将java类用NotePat++打开,可正常显示,复制过来即可.
- maven项目pom.xml添加main启动类
pom.xml配置添加main启动类: <build> <finalName>MyApp</finalName> <!-- 最终package打包的jar名称 ...
- 玩了下opencv的aruco(python版)
简单的玩了下opencv里头的aruco,用的手机相机,手机装了个 ip摄像头,这样视频就可以传到电脑上了. 首先是标定,我没打印chessboard,直接在电脑屏幕上显示,拍了17张,大概如下: 又 ...
- Spring核心模块:IoC容器介绍
1.IoC容器运用的是控制反转模式. 2.IoC容器负责管理对象之间的依赖关系,并完成对象的注入. 3.在IoC设计中,会将依赖关系注入到特定组件中,其中setter注入和构造器注入是主要的注入方式. ...
- 搭建Mock Server
1.为什么要搭建mock-server? 为了更好的分工合作,让前端能在不依赖后端环境的情况下进行开发,其中一种手段就是为前端开发者提供一个 web 容器,这个本地环境就是 mock-server. ...
- spring框架篇(一)-------spring简介与配置文件使用控制反转事例
spring简介 Spring 是一个开源框架,中文意思就是春天,也许是作者想让自己的这个框架给Java开发人员带来春天吧.其官方网站是 https://spring.io/ ,可以在官方网站下载到完 ...
- asp微信支付代码v4.1无需证书版,带回调入库的asp支付源码
昨天帮一个客户写的,他的程序是老的asp,想实现微信在手机上下单付款,让帮忙给写一份asp微信支付的接口代码,昨天晚上闲着没事,搞了一个晚上才搞好,其实asp支付并不需要安装证书,其实asp支付也很好 ...
- php 操作mysql
//由于前期数据库字段设计问题,没太注意,字段内容,后台python采集数据直接插入,没做处理,数据又不想丢掉,只能对网站数据库字段内容进行处理,100万条数据,调试了半天,很多思路都试过,各种坑,弄 ...
- tongweb安装后无法启动问题
安装后执行bin下的启动文件,但是管理界面依然无法打开 1.确认破解的dat文件是否在跟目录下,是否过期 2.如果jdk64位试试下面的方法:JAVA_HOME/jre/lib/ext/下缺少包 su ...
- pip升级
只要出现报错:python -m pip install --upgrade pip.都表示需要进行升级pip版本 查看pip版本:pip -V(pip可能是python2版本或python3版本) ...