走迷宫2(bfs)

有一个二维迷宫nms’表示迷宫的起点T’表示迷宫的终点
#’表示围墙.表示通路现在从S出发你不能穿墙问到达终点T
少需要多少步
输入格式:第一行输入n,m1<=n,m<=50表示迷宫的行列大小
接下来输入n行字符串表示迷宫
输出格式:一个整数表示走出迷宫所需的最小步数若走不出迷宫则输出 -1
样例输入1
 2 3
 S.#
..T
 样例输出1
 3
 样例输入2
 3 3
 S.#
 .#.
 .#T
样例输出2
 -1
 
复制代码
#include <iostream>
#include <queue>
using namespace std;
int vis[101][101] = {0};
char map[101][101];
int dir[4][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
int n, m, flag, val;
struct point
{
    int x, y, num; //存点和当前深度
    point(int xx, int yy, int dd)
    {
        x = xx;
        y = yy;
        num = dd;
    } //析构函数便于初始化赋值,和class类相似的处理
};
queue<point> q;
void bfs(int sx, int sy)
{
    q.push(point(sx, sy, 0)); //放入起始位置点,从此开始
    vis[sx][sy] = 1;
    while (!q.empty())
    {
        point p = q.front();
        q.pop();                  //把里元素依次取出,再将先放入点弹出(避免重复)
        if (map[p.x][p.y] == 'T') //找到终点记录(bfs第一次找到的就是最短步)
        {
            val = p.num;//装步数
            flag = 1;
            break;
        }
        for (int i = 0; i < 4; i++)
        {
            int a = p.x + dir[i][0];
            int b = p.y + dir[i][1]; //典中点之四向判断
            if (map[a][b] != '#' && vis[a][b] == 0 && a >= 0 && a < n && b >= 0 && b < m)
            {
                q.push(point(a, b, p.num + 1));
                //将四周可行的点放入队列后(加的这几个点深度相同)
                vis[a][b] = 1; //来过了
            }
        }
    }
}
int main()
{
    int s1, s2;
    flag = 0;//标记找到与否
    cin >> n >> m;
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            cin >> map[i][j];
            if (map[i][j] == 'S') //找到了入口
            {
                s1 = i;
                s2 = j;
            }
        }
    }
    bfs(s1, s2);
    if (flag == 0)
        cout << "-1";
    else
        cout << val << endl;
    return 0;
}
复制代码

 

  
posted @   渣渣纸  阅读(221)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示