宽度优先搜索(BFS):
是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型。Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想。其别名又叫BFS,属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止。
简单来说:就是每走一步都要把所有的下一步的所有可能都遍历一下,然后把错误的路口直接PASS。
例如下面的迷宫图片:绿色的为正确道路。在从起点走的每一步都需要判断!如果遇到墙(黑色方块),直接PASS。而如果用DFS的话它会一条路走到底,再去判断,然后一个一个尝试。
一句话:DFS是一条线一条线的测试,BFS是直接从一个点四面八方的扩散测试。
(BFS在比赛中一般都是迷宫问题,去找通往终点的一条路)
例题:
给定一个大小为N * M 的迷宫。迷宫由通道和墙壁组成,每一步可以向邻接的上下左右四格的通道移动。请求从起点到终点所需要的最小步数。请注意,本题假定从起点一定可以移动到终点。
第一行输入N和M,接下来输入N * M 的迷宫地图(‘#’为墙壁,‘.’为通道,‘S’为起点,'G'为重点)
输出最短路径的长度。
(限制条件:N , M <=100)
代码:
#define MAX_N 100
#define INF -1
typedef pair<int,int> P;
int N,M;
int Sx,Sy; // 开始节点
int Ex,Ey; // 结束节点
char Map[MAX_N][MAX_N];
int Ans[MAX_N][MAX_N];
int dx[4] = {0,0,1,-1};
int dy[4] = {1,-1,0,0};
int Solve()
{
queue<P> data;
while(!data.empty())
data.pop();
// 初始化数据
for(int i =0;i<N;i++)
for(int j=0;j<M;j++)
Ans[i][j] = INF;
data.push(P(Sx,Sy));
Ans[Sx][Sy] = 0;
while(!data.empty())
{
P Temp = data.front();
data.pop();
// 判断是否走到出口
if(Ex == Temp.first && Ey == Temp.second)
break;
for(int i=0;i<4;i++)
{
int Nx = Temp.first + dx[i];
int Ny = Temp.second + dy[i];
if(Ans[Nx][Ny] == INF && Map[Nx][Ny] != '#' && Nx>=0 && Nx<N && Ny>=0 && Ny<M)
{
data.push(P(Nx,Ny));
Ans[Nx][Ny] = Ans[Temp.first][Temp.second] + 1;
}
}
}
return Ans[Ex][Ey];
}
结果:
测试数据:
10 10
#S######.#
......#..#
.#.##.##.#
.#........
##.##.####
....#....#
.#######.#
....#.....
.####.###.
....#...G#
有不好的地方希望提出,谢谢。共同学习~