求广度优先算法C++走迷宫程序,可以显示路径

最好可以显示路径

一般迷宫寻路可以用递归的算法,或者用先进后出的栈数据结构实现

用的是深度优先的算法,可以寻找到走出迷宫的路径


但本题要求求出最短的路径,这就要使用广度优先的算法

一般在程序中需要用到先进先出的队列数据结构


下面是程序的代码,主要原理是用到

quei,quej和prep三个数组来构成队列

分别储存路径的行,列坐标和上一个节点在队列中的位置


大致算法如下,右三个嵌套的循环实现


首先是第一个节点进入队列

当队列不空(循环1)

     遍历队列中每节点(循环2)

    {

         将八个方向能够走的节点加入队列(循环3)

     }

     旧的节点出列

#include<iostream>
#include<ctime> 
using namespace std; 
 
#define MAXNUM 50
 
void main() 
{
    int m,n,i,j,x;
    cout<<"请输入迷宫大小"<<endl;
    cin>>m>>n;
    int maze[MAXNUM][MAXNUM];
     
    srand((int)time(NULL));
    for(i=0;i<=m+1;i++){
        for(j=0;j<=n+1;j++){
            if(i==0||j==0||i==m+1||j==n+1)
                maze[i][j]=1;
            else
            {
            x=rand()%1000;
            if(x>700){maze[i][j]=1;} //控制矩阵中1的个数,太多1迷宫很容易走不通
            else{maze[i][j]=0;}
            }
            cout<<maze[i][j]<<' ';
        }
        cout<<endl;
    }
 
    //以上是输入和迷宫生成,一下是走迷宫
 
 
    int move[8][2]={0,1,1,0,0,-1,-1,0,1,1,-1,1,-1,-1,1,-1};
    int *quei=new int[m*n];//储存行坐标队列
    int *quej=new int[m*n];//储存列坐标队列
    int *prep=new int[m*n];//储存之前一步在队列中的位置
    int head,rear,length;//队列头,队列尾,队列长度
    head=0;rear=1;length=1;
    quei[head]=1;quej[head]=1;prep[head]=-1;//入口位置进队列
 
    int pos;//当前节点在队列中的位置,
    int ii,jj,ni,nj;//当前节点的坐标,新节点的坐标
    int dir;//移动方向
 
    if(maze[1][1]==1)length=0;//第一点就不能通过
    else maze[1][1]=1;
 
 
    while(length)//队列非空继续
    {
        for(pos=head;pos<head+length;pos++)//寻找这一层所有节点
        {
            ii=quei[pos];jj=quej[pos];//当前位置坐标
            if(ii==m&&jj==n)break;
            for(dir=0;dir<8;dir++)//寻找8个方向
            {
                ni=ii+move[dir][0];nj=jj+move[dir][1];//新坐标
                if(maze[ni][nj]==0)//如果没有走过
                {
                    quei[rear]=ni;quej[rear]=nj;prep[rear]=pos;//新节点入队
                    rear=rear+1;
                    maze[ni][nj]=1;//标记已经走过
                }
            }
        }
        if(ii==m&&jj==n)break;
        head=head+length;
        length=rear-head;//这一层节点出列
    }
 
    if(ii==m&&jj==n)
    {
        while(pos!=-1)
        {
            cout<<'('<<quei[pos]<<','<<quej[pos]<<')';
            pos=prep[pos];
            if (pos!=-1)cout<<',';
        }
    }
    else
    {
        cout<<"THERE IS NO PATH."<<endl;
    }
 
    delete []quei;
    delete []quej;
    delete []prep;
}

温馨提示:内容为网友见解,仅供参考
无其他回答

求广度优先算法C++走迷宫程序,可以显示路径
首先是第一个节点进入队列 当队列不空(循环1){ 遍历队列中每节点(循环2){ 将八个方向能够走的节点加入队列(循环3)} 旧的节点出列 } include<iostream>#include<ctime> using namespace std; #define MAXNUM 50 void main() { int m,n,i,j,x; cout<<"请输入迷宫大小"<<en...

C++ 基本算法 - 广度优先搜索
1. 定义队列 g,放入起点 s。2. 使用 while 循环,条件为队列非空。3. 取出队首节点,访问并出队。4. 将未访问的相邻节点入队,标记层号递增。5. 重复步骤 2-4 直到找到出口或队列为空。在处理矩阵中的"块"个数或迷宫中的最少步数问题时,BFS 都是核心策略,通过枚举位置,用队列记录路径,...

高分跪求c++迷宫求解问题 (要用深度优先和广度优先两种方法)
路径不要直接输出,要先... RT现有一个M*N的迷宫,迷宫的地图用二维数组存储。其中,0表示此顶点可以通过,1表示不能通过。试编程找到从任意一点(x1,y1)到任意一点(x2,y2)的【最短】路径。路径不要直接输出,要先用一种结构把它存起来,找到最短路径后,再一起输出。P.S.M,N是变量。要用深度优先和广度优先...

DFS&BFS(附迷宫解法C++代码)
在迷宫解法中,BFS与DFS的实现类似,前者使用队列,后者则替换为栈。BFS通过遍历队列寻找解,同时标记已访问节点避免循环。DFS则通过递归实现深度优先策略,关键在于决策空间、可行判断与目标设定。广度优先搜索与深度优先搜索在迷宫解法中均展现了朴实无华的高效性,关键是避免循环访问。算法设计与实现时需考...

详细介绍广度优先搜索的实现,原理,c++程序
宽度优先搜索算法(又称广度优先搜索)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型。Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想。其别名又叫BFS,属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不...

【算法篇】广\/宽度优先搜索及相关问题详解
森林救援训练题中,小知需要在m*n地图上找到最短路径至伤者位置,方法同迷宫问题。在实际应用中,广度优先搜索常用于解决最短路径问题和路径存在性问题。通过理解和掌握广度优先搜索算法,能够高效解决诸多实际问题。对于C++语法、算法、数据结构等其他相关知识,如需了解更多内容,欢迎留言交流。

【算法篇】广\/宽度优先搜索及相关问题详解
继续探讨搜索算法,让我们深入理解广度优先搜索(BFS)以及它在实际问题中的应用。例如,解决迷宫问题中最少步数的计算。在4x4迷宫中,小知需从左上角走到右下角,每个格子只能走一次。遇到不可走的0,他会尝试上下左右的相邻格子。问题的关键在于如何建模和搜索过程。首先,用二维数组maze表示迷宫,0表示...

迷宫问题
失败的时候返回上一层。广度优先算法思路:进行搜索的时候面对很多选择时,先不急着进行递归,而是先把所有的选择都放到一个队列中,然后依次对这些选择继续搜索下去。若画成一颗树的话就是按层数从上往下一排排进行搜索。若还有不懂的地方你可以发我消息,进一步交流。

迷宫通路求解问题 一次编程实现的探索之旅(上)
3. **迷宫地图打印**:通过遍历二维数组打印迷宫,并使用特殊字符表示墙和道路。考虑到不同字符集支持问题,使用GBK字符集以确保兼容性。4. **查找通路**:实现查找任意一条通路的算法,使用深度优先遍历,记录访问过的路径以避免死循环。同时,使用栈来处理回溯问题,确保算法的正确性。5. **求解所有...

急!!C++深度优先算法和广度优先算法
2. 广度优先搜索 void BFS(Graph G, int visited[]){\/\/按广度优先非递归遍历图G。使用辅助队列Q和访问标志数组visited.for(v = 0; v < G.vexnum; v++)visited[v] = false;Quene q;for(v = 0; v < G.vexnum; v++)if(!visited[v]){ visited[v] = true;EnQuene(Q,v);while(!

相似回答