acwing算法基础课 844. 走迷宫

acwing 844. 走迷宫(bfs模板题)
传送门

  1. 题目大意:给你一个n * m的矩阵问你从左上角走到右下角最小需要几步,输出步数,其中矩阵里面只包含0和1两个数字,0表示可以走,1表示有障碍
  2. 思路:求最短路,且边权都是一样的,所以使用bfs即可
  3. ac代码如下:
#include
#include
#include
#include
#include
#define x first
#define y second
using namespace std;
typedef pair<int, int> PII;
const int N = 110;
int a[N][N];
int dist[N][N];
int n, m;
int bfs()//利用c++自己封装好的队列进行实现
{
    memset(dist, -1, sizeof(dist));//初始化每个点需要的步数为-1,用来表示是否已经走过
    dist[0][0] = 0;//初始左上角的点所需步数为0
    queue<PII> q;
    q.push({0, 0});
    int dx[] = {-1, 0, 1, 0}, dy[] = {0, -1, 0, 1};//偏移数组的定义
    while(q.size())
    {
        auto t = q.front();
        q.pop();
        for(int i = 0; i < 4; i ++)
        {
            int x = t.x + dx[i], y = t.y + dy[i];
            if(x >= 0 && x < n && y >= 0 && y < m && a[x][y] == 0 && dist[x][y] == -1)//判断是否越界或者已经走过
            {
                dist[x][y] = dist[t.x][t.y] + 1;
                q.push({x, y});
            }
        }
    }
    return dist[n - 1][m -1];//输出右下角的点所需步数,也可以加到while循环里用于特判终止循环
}
int main()
{
    scanf("%d%d", &n, &m);
    for (int i = 0; i < n; i++)
        for(int j = 0; j < m; j ++)
         scanf("%d", &a[i][j]);
    printf("%d\n", bfs());
    return 0;
}

你可能感兴趣的:(笔记,算法,矩阵,数据结构)