c语言bfs算法走迷宫,使用广度优先算法(BFS)走迷宫

前面介绍广度优先算法的时候提及了多次走迷宫,我们就真正的走一次迷宫试试!

要求如下:

输入给出迷宫矩阵的行数和列数,并给出迷宫(使用点 (.) 表示路,使用星 (*) 表示障碍物,使用S表示起点,T表示终点)

例如:

5 5

.    .    .   .    .

.   *  .  *   .

.    *  S *   .

.   *   *   * .

.    .    .   T   *

输出最短路径的长度。上面的例子中,路线使用原谅绿来表示,长度为11。

根据BFS算法可以很轻松的写出这个程序:

#include 

#include 

using namespace std;

int m, n;

/*表示坐标的结构*/

typedef struct{

int x, y;

} point;

point start, endp;   //起点和终点

/*表示地图上每个点的结构。is_ob表示是不是障碍物(*),

is_checked表示是否检查过该点,step为起点到这一点最少步数*/

typedef struct{

bool is_ob, is_checked;

int step;

} node;

/*map:全局地图*/

node map[100][100];

/*裁定函数,越界返回假,检查过(is_checked==true)返回假,是障碍物(is_ob==true)返回假*/

bool judge(int x, int y){

if(x >= n || x = m || y 

return !(map[x][y].is_checked) && !(map[x][y].is_ob);

}

/*偏移量*/

int X[] = {1, -1, 0, 0}, Y[] = {0, 0, -1, 1};

/*广度优先算法*/

int BFS(int x, int y){

/*到终点的最少步数*/

int result = 0;

queue Q;

point P;

P.x = x, P.y = y;

Q.push(P);

map[x][y].is_checked = true;

int top_step = 0;

while(!Q.empty()){

point top = Q.front();

Q.pop();

if(top.x == endp.x && top.y == endp.y)  //是终点,返回步数

return top_step;

for(int i = 0; i 

top_step = map[top.x][top.y].step;

int newX = top.x + X[i], newY = top.y + Y[i];

//printf("队首(%d,%d),正在检查(%d,%d)",top);

if(judge(newX, newY)){

map[newX][newY].step = top_step + 1;

P.x = newX, P.y = newY;

Q.push(P);

map[newX][newY].is_checked = true;

}

}

}

}

int main(){

cin >> n >> m;

char c;

for(int y = 0; y 

for(int x = 0; x 

cin >> c;   //读入该点

if(c == '*'){    //是障碍物

map[x][y].is_ob = true;

map[x][y].is_checked = false;

}else{  //不是障碍物

map[x][y].is_ob = false;

map[x][y].is_checked = false;

}

if(c == 'S')    //起点

start.x = x, start.y = y;

if(c == 'T')    //终点

endp.x = x, endp.y = y;

map[x][y].step = 0;

}

cout <

return 0;

}

运行结果:

610b9f2780f86e54a3288275efba21e3.png  83883c804bb84cb9a97c37c06c38e8bb.png

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值