算法竞赛---宽度优先遍历求解最短路径问题(方向数组里面是4个元素)

下面的这两个题目依然是属于这个宽度优先遍历的题目解析:

1.小明的看电影问题

和上一篇文章里面的内容有所区别,在这个小明看电影的问题里面,这个方向只有上下左右四个方向,之前无论是这个马儿的问题,还是骑士风度的牛的这个问题,都是存在着八种情况的;

但是在下面的这个问题里面,其实是只有四个情况,而且这个存在无法到达目的地的这个情况,这个也是需要我们去进行处理的;

下面的这个就是我们的代码:

1)首先针对于这个问题里面涉及到的这个方向数组,因为就是上下左右几种情况,因此这个里面,方向数组里面只有四个元素;

2)第一个for循环主要进行的就是这个数据的输入的过程,并且识别到这个s的时候存储为我们的这个过程的起始位置的具体的坐标;

3)经过这个宽度优先遍历的过程之后,我们再次使用两个循环,找到这个里面的元素是g的位置,输出这个具体的具体,也就是这个dist数组里面的内容,并且需要保证这个不是-1,因为这个-1表示的是我们的初始情况,没有遍历到的位置,也就是初始化的这个数字,如果是-1的话,表示这个是没有被处理到的;

4)因为这个如果找不到,需要输出no这个内容,因此我在这个里面设计了一个标志位,使用布尔值进行表示,如果这个过程中找到了这个g,这个时候我们就修改这个标志位的内容,针对于这个没有找到的处理,我们需要使用这个标志位进行判断一下的;

ini 复制代码
//#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
int n, m;
int x, y;
typedef pair<int, int> PII;
const int N = 505;
char a[N][N];
int dist[N][N];
​
​
int dx[] = { 0,0,1,-1 };
int dy[] = { 1,-1,0,0 };
​
void bfs()
{
    memset(dist, -1, sizeof(dist));
    queue<PII> q;
    q.push({ x,y });
    dist[x][y] = 0;
​
    while (q.size())
    {
        auto t = q.front(); q.pop();
        int i = t.first, j = t.second;
        for (int k = 0; k < 4; k++)
        {
            int x = i + dx[k], y = j + dy[k];
            if (x >= 1 && x <= n && y >= 1 && y <= m && a[x][y] != '#' && dist[x][y] == -1)
            {
                dist[x][y] = dist[i][j] + 1;
                q.push({ x, y });
            }
        }
    }
}
​
int main()
{
    cin >> n >> m;
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= m; j++)
        {
            cin >> a[i][j];
            if (a[i][j] == 's')
            {
                x = i, y = j;
            }
        }
    }
​
    bfs();
    
    bool found=false;
​
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= m; j++)
        {
            if (a[i][j] == 'g' && dist[i][j] != -1)
            {
                cout << dist[i][j] << endl;
                found=true;
            }
        }
    }
    if(found==false)
        {
        cout<<"No"<<endl;
    }
    //cout << "No" << endl;
    return 0;
}

2.小明吃饭问题

下面的这个就是小明的吃饭问题,场景式大同小异,这个代码也就是稍微修改一下就可以通过测试的:

下面的这个是题目:下面的这个题目里面的要点我都是用这个红框框为大家框选出来了;

下面的这个是代码:

1)首先这个规定的还是上下左右四个方向,并且这个路障设么标记之类的进行了变化,其他的这个代码都是不需要进行任何的修改的;

2)然后就是这个里面如果没有找到,需要输出的事-1,这个也是需要进行修改的,

3)除了上面介绍的这个路障,终点的标志发生了变化,还有就是没有找到的时候输出的内容发生了变化,其他的这个代码都不需要发生任何的变化,因此如果你知道这个具体的逻辑,你就很容易面对一个新的题目,直到在哪里进行修改,能够很快的进行处理,证明你对于bfs求解最短路径问题就掌握的还算是不错了;

ini 复制代码
#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
int n, m;
int x, y;
typedef pair<int, int> PII;
const int N = 505;
char a[N][N];
int dist[N][N];
​
​
int dx[] = { 0,0,1,-1 };
int dy[] = { 1,-1,0,0 };
​
void bfs()
{
    memset(dist, -1, sizeof(dist));
    queue<PII> q;
    q.push({ x,y });
    dist[x][y] = 0;
​
    while (q.size())
    {
        auto t = q.front(); q.pop();
        int i = t.first, j = t.second;
        for (int k = 0; k < 4; k++)
        {
            int x = i + dx[k], y = j + dy[k];
            if (x >= 1 && x <= n && y >= 1 && y <= m && a[x][y] != '#' && dist[x][y] == -1)
            {
                dist[x][y] = dist[i][j] + 1;
                q.push({ x, y });
            }
        }
    }
}
​
int main()
{
    cin >> n >> m;
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= m; j++)
        {
            cin >> a[i][j];
            if (a[i][j] == '2')
            {
                x = i, y = j;
            }
        }
    }
​
    bfs();
    
    bool found=false;
​
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= m; j++)
        {
            if (a[i][j] == '3' && dist[i][j] != -1)
            {
                cout << dist[i][j] << endl;
                found=true;
                
            }
        }
    }
    if(found==false)
        {
        cout<<"-1"<<endl;
    }
    //cout << "No" << endl;
    return 0;
}
相关推荐
拾光Ծ29 分钟前
【数据结构】二叉树接口实现指南:递归方法的高效运用 (附经典算法OJ)
数据结构·算法
freexyn34 分钟前
Matlab算法编程示例4:数值解法求解常微分方程的代码实例
人工智能·算法·matlab·微分方程·数值解法·算法代码
终是蝶衣梦晓楼42 分钟前
HiC-Pro Manual
java·开发语言·算法
惊岁晚1 小时前
【实践记录】github仓库的更新
算法·容器·r语言·github
独好紫罗兰1 小时前
C++信息学奥赛一本通-第一部分-基础一-第一章
c++·算法
Ghost-Face2 小时前
《算法导论》笔记——循环不变式及插入排序证明
算法
想你依然心痛2 小时前
编程算法:技术创新与业务增长的核心驱动力
算法
焊锡与代码齐飞2 小时前
嵌入式第十八课!!数据结构篇入门及单向链表
c语言·数据结构·学习·算法·链表·排序算法
AI松子6662 小时前
Sparse4D系列算法:迈向长时序稀疏化3D目标检测的新实践
人工智能·算法·目标检测