数学-算法-广度优先搜索

Posted PorFavor

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数学-算法-广度优先搜索相关的知识,希望对你有一定的参考价值。

/*本文数据结构内容节选自CSDN*/

1.

图的遍历方法一般有两种,第一种(Depth First Search)深度优先搜索,简称为DFS。第二种(Breadth  First Search)广度优先搜索,简称为BFS。本文简述广度优先搜索。


如图是BFS的遍历顺序。广度优先搜索按层次遍历的过程,其搜索过程如下:假设从图中某结点i出发,在访问了i之后依次访问i的各个未曾访问的邻接点,然后分别从这些邻接点出发按广度优先搜索的顺序遍历图,直至图中所有可被访问的结点都被访问到。


typedef char VertexType; /* 顶点类型应由用户定义 */

typedef int EdgeType; /* 边上的权值类型应由用户定义 */


#define MAXSIZE 9 /* 存储空间初始分配量 */

#define MAXEDGE 15

#define MAXVEX 9


typedef struct

{

char vexs[MAXVEX]; /* 顶点表 */

int arc[MAXVEX][MAXVEX];/* 邻接矩阵,可看作边表 */

int numVertexes, numEdges; /* 图中当前的顶点数和边数 */

} MGraph;


/* 邻接矩阵的广度遍历算法 */

void BFSTraverse(MGraph G)

{

int i, j;

Queue Q;

for (i = 0; i < G.numVertexes; i++)

visited[i] = false;

InitQueue(&Q);/* 初始化一辅助用的队列 */


for (i = 0; i < G.numVertexes; i++)/* 对每一个顶点做循环 */

{

    if (!visited[i])/* 若是未访问过就处理 */

    {

        visited[i] = true;/* 设置当前顶点访问过 */

        cout << G.vexs[i] << ' '; /* 打印顶点,也可以其它操作 */

        EnQueue(&Q, i);/* 将此顶点入队列 */

        while (!QueueEmpty(Q))/* 若当前队列不为空 */

        {

            DeQueue(&Q, &i);/* 将队对元素出队列,赋值给i */

            for (j = 0 ; j < G.numVertexes; j++)

            {

                /* 判断其它顶点若与当前顶点存在边且未访问过  */

                if (G.arc[i][j] == 1 && !visited[j])

                {

                    visited[j] = true;/* 将找到的此顶点标记为已访问 */

                    cout << G.vexs[j] << ' '; /* 打印顶点 */

                    EnQueue(&Q, j);/* 将找到的此顶点入队列  */

                }

            }

        }

    }

}

}



2.迷宫问题

定义一个二维数组: 
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表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。 

搜索顺序如下:


代码



/**

* 广度优先搜索

* @param Vs 起点

* @param Vd 终点

*/  

bool BFS(Node& Vs, Node& Vd){

queue<Node> Q;

Node Vn, Vw;

int i;

//用于标记当visit[i][j]==true时,说明节点访问过,也就是黑色  

bool visit[MAXL][MAXL];

//四个方向  

int dir[][2] = {

{0, 1}, {1, 0},

{0, -1}, {-1, 0}

};

//初始状态将起点放进队列Q  

Q.push(Vs);

visit[Vs.x][Vs.y] = true;//设置节点已经访问过了!  

while (!Q.empty()){//队列不为空,继续搜索

    //取出队列的头Vn  

    Vn = Q.front();

    Q.pop();

    for(i = 0; i < 4; ++i){

        Vw = Node(Vn.x+dir[i][0], Vn.y+dir[i][1]);//计算相邻节点  

        if (Vw == Vd){//找到终点了

        //把路径记录,这里没给出解法  

        return true;//返回  

    }

    if (isValid(Vw) && !visit[Vw.x][Vw.y]){

        //Vw是一个合法的节点并且未访问过 

        Q.push(Vw);//加入队列Q  

        visit[Vw.x][Vw.y] = true;//设置节点访问

        }

    }

}

return false;//无解  

}





*笔记不保证正确性



以上是关于数学-算法-广度优先搜索的主要内容,如果未能解决你的问题,请参考以下文章

基本算法——深度优先搜索(DFS)和广度优先搜索(BFS)

广度优先搜索算法

图的广度、深度优先搜索和拓扑排序

深度优先搜索和广度优先搜索、A星算法三种算法的区别和联系?

算法题——深度优先搜索与广度优先搜索

深度优先搜索和广度优先搜索、A星算法三种算法的区别和联系?