最短路模型(二)

简介: AcWing 188. 武士风度的牛

AcWing 188. 武士风度的牛

本题链接:AcWing 188. 武士风度的牛

本博客提供本题截图:

image.png

image.png

image.png

本题分析

dist数组:记录路径的长度,同时和pre数组一样,起到了判重的作用,因为我们初始化为-1,且我们会不断的更新dist数组,所以对于dist的值,如果为-1证明没有被更新,则可以更新,反之不可更新,相比较与上题,本题的起始位置和终点来自于输入的字符串,所以我们想要求起点的话,可以用两个for循环去求得,虽然是八扩散,但是为“日”字扩散,所以也用的向量的方式,最后注意本题的输入是先输入列再输入行。


AC代码

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
#define x first
#define y second
using namespace std;
typedef pair<int, int> PII;
const int N = 155, M = N * N;
int n, m;
int dist[N][N];
char g[N][N];
PII q[M];
int bfs()
{
    memset(dist, -1, sizeof dist);
    int dx[8]= {-2, -1, 1, 2, 2, 1, -1, -2}
    int dy[8] = {1, 2, 2, 1, -1, -2, -2, -1};    
    int x1, y1;
    for (int i = 0; i < n; i ++ )
        for (int j = 0; j <m; j ++ )
            if (g[i][j] == 'K')
            {
               x1 = i;
               y1 = j;
               break;
            }
    q[0] = {x1, y1};
    dist[x1][y1] = 0;
    int hh = 0, tt = 0;
    while (hh <= tt)
    {
        auto t = q[hh ++];
        for (int i = 0; i < 8; i ++ )
        {
            int a = t.x + dx[i], b = t.y + dy[i];
            if (a < 0 || a >= n || b < 0 || b >= m) continue;
            if (dist[a][b] != -1) continue;
            if (g[a][b] == '*') continue;
            dist[a][b] = dist[t.x][t.y] + 1;
            q[ ++ tt] = {a, b};
            if (g[a][b] == 'H') return dist[a][b];
        }
    }
    return -1;
}
int main()
{
    scanf("%d%d", &m, &n);
    for (int i = 0; i < n; i ++ ) scanf("%s", g[i]);
    printf("%d", bfs());
    return 0;
}


AcWing 1100. 抓住那头牛

本题链接:AcWing 1100. 抓住那头牛

本博客提供本题截图:

image.png

本题分析

dist数组的作用和上题一致,bfs中三个if对应三个操作,如果操作合法则加入到队列中

AC代码

#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int N  = 100010;
int q[N];
int dist[N];
int n, k;
int bfs()
{
    memset(dist, -1, sizeof dist);
    q[0] = n;
    int hh = 0, tt = 0;
    dist[n] = 0;
    while (hh <= tt)
    {
        auto t = q[hh ++];
        if (t + 1 < N && dist[t + 1] == -1)
        {
            q[ ++ tt] = t + 1;
            dist[t + 1] = dist[t] + 1;
        }
        if (t - 1 >= 0 && dist[t - 1] == -1)
        {
            q[ ++ tt] = t - 1;
            dist[t - 1] = dist[t] + 1;
        }
        if (t * 2 < N && dist[2 * t] == -1)
        {
            q[ ++ tt] = 2 * t;
            dist[2 * t] = dist[t] + 1;
        }
        if (t == k) return dist[t];
    }
    return -1;
}
int main()
{
    scanf("%d%d", &n, &k);
    printf("%d", bfs());
    return 0;
}

三、时间复杂度

关于最短路模型的时间复杂度以及证明,后续会给出详细的说明以及证明过程,目前先鸽了。


目录
相关文章
|
7月前
|
算法
最短路之Floyd算法
最短路之Floyd算法
84 1
|
7月前
没有给出二分图两个左右点集时的二分图最大匹配
没有给出二分图两个左右点集时的二分图最大匹配
35 0
|
4月前
|
自然语言处理 算法
HanLP — HMM隐马尔可夫模型 - 路径规划算法 - 求解最短路径 - 维特比(Viterbi)算法
HanLP — HMM隐马尔可夫模型 - 路径规划算法 - 求解最短路径 - 维特比(Viterbi)算法
67 0
HanLP — HMM隐马尔可夫模型 - 路径规划算法 - 求解最短路径 - 维特比(Viterbi)算法
|
6月前
|
算法
【经典LeetCode算法题目专栏分类】【第4期】BFS广度优先算法:单词接龙、最小基因变化、二进制矩阵中的最短路径
【经典LeetCode算法题目专栏分类】【第4期】BFS广度优先算法:单词接龙、最小基因变化、二进制矩阵中的最短路径
|
7月前
|
算法 测试技术 C#
【图论】 【割点】 【双连通分类】LCP 54. 夺回据点
【图论】 【割点】 【双连通分类】LCP 54. 夺回据点
|
7月前
|
机器学习/深度学习 人工智能 算法
【图论 单源最短路】100276. 最短路径中的边
【图论 单源最短路】100276. 最短路径中的边
|
算法
图论算法(最短路、网络流、二分图)
图论算法(最短路、网络流、二分图)
108 0
|
算法 Java
单源最短路径【学习算法】
单源最短路径【学习算法】
82 0
|
存储 算法
最短路Johnson算法
最短路Johnson算法
116 0
|
算法

热门文章

最新文章