走迷宫(BFS板子题)

举报
irrational 发表于 2022/01/18 00:18:48 2022/01/18
【摘要】 给定一个 n×m 的二维整数数组,用来表示一个迷宫,数组中只包含 0 或 1,其中 0 表示可以走的路,1表示不可通过的墙壁。 最初,有一个人位于左上角 (1,1)处,已知该人每次可以向上、下、左、右任意一个方向移动一个位置。 请问,该人从左上角移动至右下角 (n,m)处,至少需要移动多少次。 数据保证 (1,1)处和 (n,m)...

给定一个 n×m 的二维整数数组,用来表示一个迷宫,数组中只包含 0 或 1,其中 0 表示可以走的路,1表示不可通过的墙壁。

最初,有一个人位于左上角 (1,1)处,已知该人每次可以向上、下、左、右任意一个方向移动一个位置。

请问,该人从左上角移动至右下角 (n,m)处,至少需要移动多少次。

数据保证 (1,1)处和 (n,m) 处的数字为 0,且一定至少存在一条通路。

输入格式

第一行包含两个整数 n和 m。

接下来 n行,每行包含 m 个整数(0 或 1),表示完整的二维数组迷宫。

输出格式

输出一个整数,表示从左上角移动至右下角的最少移动次数。

数据范围

1≤n,m≤100

输入样例:


  
  1. 5 5
  2. 0 1 0 0 0
  3. 0 1 0 1 0
  4. 0 0 0 0 0
  5. 0 1 1 1 0
  6. 0 0 0 1 0

输出样例:

8

 

这个题其实非常简单,你只需要了解一下 bfs就可以了。

模板:

宽度优先遍历
    
        queue<int> q;
        st[1] = true; // 表示1号点已经被遍历过
        q.push(1);

        while (q.size())
        {undefined
            int t = q.front();
            q.pop();

            for (int i = h[t]; i != -1; i = ne[i])
            {undefined
                int j = e[i];
                if (!s[j])
                {undefined
                    st[j] = true; // 表示点j已经被遍历过
                    q.push(j);
                }
            }
        }

 


  
  1. #include <cstring>
  2. #include <iostream>
  3. #include <algorithm>
  4. #include <queue>
  5. using namespace std;
  6. typedef pair<int, int> PII;
  7. const int N = 110;
  8. int n, m;
  9. int g[N][N], d[N][N];
  10. int bfs()
  11. {
  12. queue<PII> q;
  13. memset(d, -1, sizeof d);
  14. d[0][0] = 0;
  15. q.push({0, 0});
  16. int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};
  17. while (q.size())
  18. {
  19. auto t = q.front();
  20. q.pop();
  21. for (int i = 0; i < 4; i ++ )
  22. {
  23. int x = t.first + dx[i], y = t.second + dy[i];
  24. if (x >= 0 && x < n && y >= 0 && y < m && g[x][y] == 0 && d[x][y] == -1)
  25. {
  26. d[x][y] = d[t.first][t.second] + 1;
  27. q.push({x, y});
  28. }
  29. }
  30. }
  31. return d[n - 1][m - 1];
  32. }
  33. int main()
  34. {
  35. cin >> n >> m;
  36. for (int i = 0; i < n; i ++ )
  37. for (int j = 0; j < m; j ++ )
  38. cin >> g[i][j];
  39. cout << bfs() << endl;
  40. return 0;
  41. }

思路就是你可以用dx dy表示方向函数,然后把你的方向写出来,按照你的方向走,设置一个d初始为-1表示还没有到达过,然后不断地调整,最后走到终点。

文章来源: blog.csdn.net,作者:irrationality,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/weixin_54227557/article/details/120604831

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。