数学-算法-广度优先搜索
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;//无解
}
*笔记不保证正确性
以上是关于数学-算法-广度优先搜索的主要内容,如果未能解决你的问题,请参考以下文章