通俗易懂的迷宫问题· bfs

1086.迷宫问题

Time Limit: 1000 MS    Memory Limit: 32768 KB
Total Submission(s): 64    Accepted Submission(s): 29

Description

定义一个二维数组: 

int maze[5][5] = {

0, 1, 0, 0, 0,

0, 1, 0, 1, 0,

0, 0, 0, 0, 0,

0, 1, 1, 1, 0,

0, 0, 0, 1, 0,

};

它表示一个迷宫,其中的1表示墙壁,0表示可以走

的路,只能横着走或竖着走,不能斜着走,要求编

程序找出从左上角到右下角的最短路线。

Input

一个5 × 5的二维数组,表示一个迷宫。数据保证有唯一解。

Output

左上角到右下角的最短路径,格式如样例所示。

Sample Input

0 1 0 0 0
0 1 0 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0

Sample Output

(0, 0)
(1, 0)
(2, 0)
(2, 1)
(2, 2)
(2, 3)
(2, 4)
(3, 4)

(4, 4)

刚接触bfs时这道题没有思路, 但现在突然想通了 ,希望可以帮到你们,详解代码

#include <stdio.h> #include <iostream> #include <algorithm> #include <cstring> #include <queue> using namespace std; int dir[4][2] ={1,0, 0,1, -1,0, 0,-1}; int a[7][7]; bool visit[7][7]; 标记一个点是否访问过。以免陷入无限循环!! struct note 结构体记载横 纵坐标 {     int x;     int y; }s,pre[7][7];///pre【x】【y】用来记载(x,y)的前一个点 int bfs( ) {     int i, j;     queue<note>q;     q.push( {0, 0});     visit[0][0] = 1;     while( !q.empty( ))     {        s = q.front();        q.pop();        for( i = 0; i<4; i++)        {            int x = dir[i][0] + s.x;            int y  =dir[i][1] + s.y;            if( a[x][y] == 0 && !visit[x][y] && x>=0 && x<=4 &&y<=4&&y>=0)            {                visit[x][y]  = 1;                q.push({x, y});                pre[x][y].x = s.x;                pre[x][y].y = s.y;            }        }     } } void put( int x, int y ) 这个函数我也是参考别人的代码 自己走走也能行得通 不过个人对递归

{ 理解不深

    if( x == 0 && y == 0) 触底反弹, 比如 (4, 4)进来,put, put,,,,,直到(0,0)输出,然后        { 一层一层返回,执行printf         printf("(%d, %d)\n", x, y);         return ;        }     put( pre[x][y].x, pre[x][y].y);     printf("(%d, %d)\n", x, y); } int main() {     int i, j, k;     for( i = 0; i<5; i++)         for( j = 0; j<5; j++)         scanf("%d", &a[i][j]);      bfs();      put( 4, 4 );      return 0; }

有不妥的地方多多理解 谢谢观看

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值