迷宫问题

简介: bfs

定义一个二维数组:

int maze5 = {

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
Output
(0, 0)
(1, 0)
(2, 0)
(2, 1)
(2, 2)
(2, 3)
(2, 4)
(3, 4)
(4, 4)

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#define M 5
#define N 5

using namespace std;

int maze[M][N],vis[M][N];
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0};
struct point{
    int x;
    int y;
}pr[10][10];
queue<point> q;
void bfs(){
    point s;
    s.x=0,s.y=0;
    q.push(s);
    vis[0][0]=1;
    while(!q.empty()){
        point p=q.front();
        q.pop();
        if(p.x==M-1&&p.y==N-1){
            return;
        }
        for(int i=0;i<4;i++){
            int a,b;
            a=p.x+dx[i];
            b=p.y+dy[i];
            if(!maze[a][b]&&!vis[a][b]&&a>=0&&a<5&&b>=0&&b<5){
                point t;
                t.x=a;
                t.y=b;
                q.push(t);
                vis[a][b]=1;
                pr[a][b]=p;
            }
        }
    }
}
void output(point p){
    if(!p.x&&!p.y){
        cout<<"(0, 0)"<<endl;
        return;
    }
    output(pr[p.x][p.y]);
    cout<<"("<<p.x<<", "<<p.y<<")"<<endl;
}

int main(){
    for(int i=0;i<5;i++){
        for(int j=0;j<5;j++){
            scanf("%d",&maze[i][j]);
        }
    }
    bfs();
    point end;
    end.x=4;
    end.y=4;
    output(end);
} 
相关文章
|
3月前
acwing 1112 迷宫
acwing 1112 迷宫
17 0
|
3月前
acwing 1076 迷宫问题
acwing 1076 迷宫问题
15 0
|
8月前
|
存储 算法
使用 BFS 解决走迷宫问题
使用 BFS 解决走迷宫问题
90 1
|
8月前
|
算法 Java C++
走迷宫(BFS)
走迷宫(BFS)
55 0
|
机器学习/深度学习
1215:迷宫
1215:迷宫
112 0
洛谷 P1141 01迷宫
洛谷 P1141 01迷宫
84 0
AcWing——方格迷宫(有点不一样的迷宫问题)
AcWing——方格迷宫(有点不一样的迷宫问题)
98 0
|
定位技术 C++
基于c++深度优先遍历迷宫
基于c++深度优先遍历迷宫
149 0
基于c++深度优先遍历迷宫