【PTA】龙舌兰酒吧 (BFS求双源最短路)

简介: 【PTA】龙舌兰酒吧 (BFS求双源最短路)

目录

1.题目描述

2.输入输出

3.解题思路

4.样例解析

5.代码实现


1.题目描述


image.png



有一个大小为n*m的矩形小镇,城镇上有房屋(“#”表示无法通过),有空地(“.”表示可通行),每次移动只能朝上下左右四个方向,且需花费1单位时间。


一天,二乔和承太郎约定在龙舌兰酒吧见面,两人同时从各自所在位置向酒吧出发。请问最少需要过多少时间他们才能在酒吧碰面。


地图上P表示二乔的位置,W表示承太郎的位置,B表示酒吧的位置。


第一行包含两个整数n,m,表示城镇的大小。(1<=m,n<=1000)。


接下来n行,每行m个字符,表示小镇的情况。


输出两人在酒吧碰面的最少花费时间,如果无法在酒吧碰面则输出-1。



2.输入输出


image.png



输入样例:

5 4
. W . #
P # . .
. . . .
B . . #
# . . .

输出样例:

4



3.解题思路



这道题就是典型的利用bfs(宽度优先搜索)来求解最短路的问题

如果两个人中有一个人无法到达目的地,则输出-1

如果两个人都能到达,则输出两个人到达时间后的最大值



4.样例解析


image.png



5.代码实现


image.png


定义 PII ,使用piar来储存坐标

C++ pair的基本用法总结(整理)_sevencheng798的博客-CSDN博客_c++ pair


image.png



使用结构体来存储出发点和终点的坐标(也可以使用pair来存储)


image.png



初始化结果为无穷大,以此来判断是否能到达终点


image.png


使用数组存储位移偏移量,方便下面直接使用循环来遍历地图(BFS)


image.png


cin >> n >> m;
    getchar();
    for(int i = 1; i <= n; i ++ )
        for(int j = 1; j <= m; j ++ )
        {
            cin >> g[i][j];
            if(g[i][j] == 'P') p1.x = i, p1.y = j;
            if(g[i][j] == 'W') w1.x = i, w1.y = j;
            if(g[i][j] == 'B') xp = i, yp = j;
        }

注意这个 gecthcar() ,虽然本题并不会因为这个而过不了,但是我们出于严瑾的态度还是将最后的空格读掉 (cin 不会将最后的换行符读取)


image.png



然后先对先出发一个点,判断是否能到达,如果不能到达,直接输出 -1并return

这样的话属于是一种 剪枝 操作,能在一定程度上减少时间

时间对比:


image.png


当然,因为出发点是由我们人为选择的,所以也存在一定的偶然性


image.png



进入 BFS 操作:

首先初始一个 存储PII 的队列,并创建一个dist数组,初始化每个点为无穷大用来存储每个点到出发点的距离

(如果是设置在全局变量,则需要重置数组为无穷大)



image.png


将出发点入队,并将出发点的距离置为0



 核心代码(对列实现BFS)


image.png


当队列中还有元素时,将其取出并弹出队列

①如果这一点已经到达终点的时候,直接break 返回

②还未到达终点的时候

按照我们上面设置的位置偏移量数组 ,使用一个for循环遍历上下左右四个方向

将每个方向所到达的地址用变量临时存储并对其进行判断:


if(a > 0 && a <= n && b > 0 && b <= m && g[a][b] != '#' && dist[a][b] == INF)


image.png


同理对第二个出发点进行遍历和判断


cout << max(resp, resw) << endl;

如果能够从上面走到走一步,证明两个出发点都能到达终点,则输出两者的最大值


AC代码

#include <cstring>
#include <algorithm>
#include <iostream>
#include <queue>
#define PII pair<int, int> 
using namespace std;
const int N = 1010, INF = 1e9;
int n, m;
int resp = INF, resw = INF;
char g[N][N];
struct Person
{
    int x, y;
}p1, w1;
int xp = 0, yp = 0;
int dx[] = {1, 0, -1, 0}, dy[] = {0, 1, 0, -1};
int bfs(Person p)
{
    queue<PII> q;
    int dist[N][N];
    for(int i = 1; i <= n; i ++ )
        for(int j = 1; j <= m; j ++ )
            dist[i][j] = INF;
    q.push({p.x, p.y});
    dist[p.x][p.y] = 0;
    while(q.size())
    {
        PII t = q.front();
        q.pop();
        if(t.first == xp && t.second == yp) break;
        for(int i = 0; i < 4; i ++ )
        {
            int a = t.first + dx[i], b = t.second + dy[i];
            if(a > 0 && a <= n && b > 0 && b <= m && g[a][b] != '#' && dist[a][b] == INF)
            {
                q.push({a, b});
                dist[a][b] = dist[t.first][t.second] + 1;
            }
        }
    }
    return dist[xp][yp];
}
int main()
{
    cin >> n >> m;
    //getchar();
    for(int i = 1; i <= n; i ++ )
        for(int j = 1; j <= m; j ++ )
        {
            cin >> g[i][j];
            if(g[i][j] == 'P') p1.x = i, p1.y = j;
            if(g[i][j] == 'W') w1.x = i, w1.y = j;
            if(g[i][j] == 'B') xp = i, yp = j;
        }
    resp = bfs(p1);
    if(resp == INF) 
    {
        cout << -1 << endl;
        return 0;
    }
    resw = bfs(w1);
    if(resw == INF) 
    {
        cout << -1 << endl;
        return 0;
    }
    cout << max(resp, resw) << endl;
    return 0;
}
目录
相关文章
|
Kubernetes 关系型数据库 容器
Kubernetes之路 3 - 解决服务依赖
在容器服务的客户群中,一个经常被问起的问题就是如何处理服务间依赖。本文介绍了常见的解决方法来实现服务的依赖检查,还进一步用示例展示了如何利用init container, liveness/readiness探针等技术实现服务健康检查,依赖检查等等功能。
12108 1
|
5月前
|
存储 缓存 自然语言处理
初识华为RazorAttention
RazorAttention是一种静态KV Cache压缩算法,旨在解决长上下文大型语言模型(LLM)中KV缓存占用显存过大的问题。通过基于注意力头的有效视野动态调整KV Cache大小,RazorAttention能够压缩70%的KV Cache,同时保持模型长序列能力几乎无损。该方法保护检索头(包括Echo Head和Induction Head)的KV Cache,确保重要信息不丢失,并对非检索头进行压缩优化。相比在线动态压缩方法,RazorAttention无需实时计算,兼容FlashAttention,显著降低存储与计算开销,为模型部署提供高效解决方案。
|
8月前
|
人工智能 自然语言处理 数据挖掘
探索CRM系统:销售易、白码、纷享销客的品牌与功能分析
销售易CRM是一款功能强大的客户关系管理工具,支持移动化与社交化操作,销售人员可随时随地访问和更新客户信息。它融合了AI与大数据技术,提供智能数据分析,帮助企业洞察客户需求并预测销售趋势。销售易CRM覆盖营销、销售和服务全流程,并实现自动化管理,提升业务效率。其国际化能力满足跨国公司需求,支持多语言、多币种及海外服务器集群,助力企业全球化发展。适用于大型企业、注重销售效率与客户体验的企业,以及进行全流程数字化转型的企业。
|
存储 人工智能 小程序
比赛须知【2024 年睿抗机器人开发者大赛CAIP-编程技能赛(国赛)】
该文章是关于2024年睿抗机器人开发者大赛CAIP-编程技能赛(国赛)的参赛通知,强调了比赛时间、阅读比赛须知的重要性,并列举了多项比赛期间禁止的行为以确保比赛的公平性。
 比赛须知【2024 年睿抗机器人开发者大赛CAIP-编程技能赛(国赛)】
|
10月前
|
Dubbo Java 应用服务中间件
入门运行Soul
入门运行Soul
295 3
入门运行Soul
|
7月前
|
JSON API 数据格式
阿里巴巴商品详情接口(阿里巴巴 API 系列)
在电商开发中,获取阿里巴巴商品详情信息对数据分析、竞品研究等至关重要。通过调用其商品详情接口,开发者可获取标题、价格、图片、描述等数据,满足多种业务需求。接口采用HTTPS协议,支持GET/POST请求,返回JSON格式数据。示例代码展示了如何使用Python的requests库进行接口请求,需传递商品ID和访问令牌。实际应用时,请依据官方文档调整参数并确保安全性。
252 10
|
弹性计算 Linux 数据库
阿里云ECS服务器安装宝塔BT面板图文教程
宝塔BT面板支持Linux和Windows系统,本文以阿里云ECS云服务器Linux系统安装宝塔面板为例,云服务器吧分享安装宝塔面板教程: ECS安装宝塔BT面板图文教程开始: SSH登录ECS服务器 使用命令ssh root@你的服务器公网IP登录linux服务器。
19522 0
阿里云ECS服务器安装宝塔BT面板图文教程
数据库系统工程师考点笔记
数据库系统工程师考点笔记
1309 0
|
数据采集 API 数据处理
FreeRTOS入门教程(软件定时器)
FreeRTOS入门教程(软件定时器)
494 0