您的位置:首页 > 其它

通俗易懂的迷宫问题· bfs

2018-03-06 14:57 246 查看

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;
}

有不妥的地方多多理解 谢谢观看
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: