C++广度优先搜索算法之走出迷宫



走出迷宫

Description

当你站在一个迷宫里的时候,往往会被错综复杂的道路弄得失去方向感,如果你能得到迷宫地图,事情就会变得非常简单。
假设你已经得到了一个n*m的迷宫的图纸,请你找出从起点到出口的最短路。

Input
第一行是两个整数n和m(1<=n,m<=100),表示迷宫的行数和列数。
接下来n行,每行一个长为m的字符串,表示整个迷宫的布局。字符'.'表示空地,'#'表示墙,'S'表示起点,'T'表示出口。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您讲解C++实现广度优先搜索算法解决迷宫问题并且展示出路径。广度优先搜索算法是一种用于遍历或搜索树或图的算法,它从起点开始,逐层遍历每个可能的路径,直到找到目标节点或无法继续搜索为止。 在解决迷宫问题时,我们可以将迷宫看作一个图,其中每个格子都是一个节点,相邻的格子之间有一条边。我们可以使用广度优先搜索算法从起点开始遍历图,直到找到终点为止。在搜索过程中,我们需要记录每个节点的深度,并且每次遍历到一个节点时,都需要判断它是否是终点,如果是终点则搜索结束,否则继续向下搜索。 以下是C++代码示例: ```c++ #include <iostream> #include <queue> //使用STL库中的队列 #define ROW 5 #define COL 5 using namespace std; struct Node{ int x, y, depth, pre; //pre存储前驱节点的下标 }; int maze[ROW][COL] = { {0, 0, 0, 0, 0}, {0, 1, 1, 0, 0}, {0, 1, 1, 0, 0}, {0, 0, 0, 1, 0}, {0, 0, 0, 1, 0} }; int visited[ROW][COL] = {0}; //记录节点是否被访问过 int dx[4] = {0, 0, 1, -1}; //定义四个方向的移动 int dy[4] = {1, -1, 0, 0}; void bfs(int x, int y){ queue<Node> q; //定义队列 Node start = {x, y, 0, -1}; //起点节点 q.push(start); //将起点节点入队 visited[x][y] = 1; //标记起点节点已访问 while(!q.empty()){ //队列不为空时循环 Node cur = q.front(); //取出队首元素 q.pop(); //将队首元素出队 if(cur.x == ROW-1 && cur.y == COL-1){ //到达终点 cout << "Find the way! The shortest path length is " << cur.depth << endl; vector<int> path; //定义存储路径的数组 int index = q.size(); //从队尾往前搜索 while(cur.pre != -1){ //前驱节点存在 path.push_back(index-1); //将当前节点加入路径 cur = q.front(); //当前节点指向前驱节点 q.pop(); //将前驱节点出队 index = cur.pre; //将前驱节点下标赋给index } path.push_back(index-1); //将起点节点加入路径 for(int i=path.size()-1; i>=0; --i){ //倒序输出路径 cout << "(" << q[path[i]].x << "," << q[path[i]].y << ") "; } cout << endl; return; } for(int i=0; i<4; ++i){ //向四个方向进搜索 int nx = cur.x + dx[i]; int ny = cur.y + dy[i]; if(nx<0 || nx>=ROW || ny<0 || ny>=COL) continue; //越界跳过 if(visited[nx][ny] || maze[nx][ny]) continue; //已访问或者是墙跳过 visited[nx][ny] = 1; //标记为已访问 Node next = {nx, ny, cur.depth+1, q.size()}; //将下一个节点入队 q.push(next); } } cout << "Can't find the way!" << endl; //无法到达终点 } int main(){ bfs(0, 0); //从起点开始搜索 return 0; } ``` 在上述代码中,我们使用广度优先搜索算法从起点开始遍历迷宫,并且使用visited数组记录节点是否被访问过。在搜索过程中,我们向四个方向进搜索,直到找到终点或者无法继续搜索为止。如果找到了终点,则输出"Find the way! The shortest path length is xxx",其中xxx表示最短路径的长度,搜索结束。同时,我们定义了一个存储路径的数组path,使用pre字段存储前驱节点的下标,从而可以找到最短路径。最后,我们倒序输出路径,从起点到终点。 希望这个例子可以帮助您理解C++实现广度优先搜索算法解决迷宫问题并且展示出路径。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值