走迷宫2(bfs)
有一个二维迷宫,n行m列,‘s’表示迷宫的起点,‘T’表示迷宫的终点,
‘#’表示围墙,‘.’表示通路。现在从S出发,你不能穿墙,问到达终点T最
少需要多少步?
输入格式:第一行输入n,m(1<=n,m<=50)表示迷宫的行列大小。
接下来输入n行字符串表示迷宫。
输出格式:一个整数,表示走出迷宫所需的最小步数,若走不出迷宫则输出 -1。
样例输入1
2 3
S.#
..T
样例输出1
3
样例输入2
3 3
S.#
.#.
.#T
样例输出2
-1
‘#’表示围墙,‘.’表示通路。现在从S出发,你不能穿墙,问到达终点T最
少需要多少步?
输入格式:第一行输入n,m(1<=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; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?