百科--Bfs

来源:互联网 发布:php表单提交数据库 编辑:程序博客网 时间:2024/06/04 19:47

宽度优先搜索 编辑词条

B 添加义项 
?

宽度优先搜索算法(又称广度优先搜索)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型。Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想。其别名又叫BFS,属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结

BFS的空间复杂度为 O(|V| + |E|)

实际应用

BFS在求解最短路径或者最短步数上有很多的应用。

应用最多的是在走迷宫上。

单独写代码有点泛化,取来自九度1335闯迷宫 一例说明,并给出C++/Java的具体实现。

在一个n*n的矩阵里走,从原点(0,0)开始走到终点(n-1,n-1),只能上下左右4个方向走,只能在给定的矩阵里走,求最短步数。n*n是01矩阵,0代表该格子没有障碍,为1表示有障碍物。

果为止。

int map[max][max] // 表示01矩阵

int step={{-1,0},{1,0},{0,-1},{0,1}} //表示 上下左右 四个方向

int visit[max][max] // 表示 该点是否被访问过, 防止回溯,回溯耗时很大

》》嗯 下面的代码是百科上的,只能用于理解,模板等我做的题多了。把这再修改过来。。。。。

核心代码。基本上所有的BFS问题都可以使用类似的代码来解决。

折叠C++

structNode

{

intx;

inty;

intstep;

Node(intx1,inty1,intstep1):x(x1),y(y1),step(step1){}

};

intBFS()

{

Nodenode(0,0,0);

queue<Node>q;

while(!q.empty())q.pop();

q.push(node);

while(!q.empty())

{

node=q.front();

q.pop();

if(node.x==n-1&&node.y==n-1)

{

returnnode.step;

}

visit[node.x][node.y]=1;

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

{

intx=node.x+stepArr[i][0];

inty=node.y+stepArr[i][1];

if(x>=0&&y>=0&&x<n&&y<n&&visit[x][y]==0&&mazeArr[x][y]==0)

{

visit[x][y]=1;

Nodenext(x,y,node.step+1);

q.push(next);

}

}

}

return-1;

}


0 0