BFS的个人理解和相关例题

宽度优先搜索(BFS):

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

简单来说:就是每走一步都要把所有的下一步的所有可能都遍历一下,然后把错误的路口直接PASS。

例如下面的迷宫图片:绿色的为正确道路。在从起点走的每一步都需要判断!如果遇到强(黑色方块),这接PASS。而如果用BFS的话它会一条路走到底,再去判断,然后一个一个尝试。

一句话:DFS是一条线一条线的测试,BFS是直接从一个点四面八方的扩散测试。

(BFS在比赛中一般都是迷宫问题,去找通往终点的一条路)

BFS的个人理解和相关例题_第1张图片              BFS的个人理解和相关例题_第2张图片

例题:

        给定一个大小为M 的迷宫。迷宫由通道和墙壁组成,每一步可以向邻接的上下左右四格的通道移动。请求从起点到终点所需要的最小步数。请注意,本题假定从起点一定可以移动到终点。

第一行输入N和M,接下来输入M  的迷宫地图(‘#’为墙壁,‘.’为通道,‘S’为起点,'G'为重点)

输出最短路径的长度。

(限制条件:N , M <=100)


代码:

#define MAX_N 100
#define INF -1
typedef pair 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

data; while(!data.empty()) data.pop(); // 初始化数据 for(int i =0;i=0 && Nx=0 && Ny

结果:

BFS的个人理解和相关例题_第3张图片

测试数据:

10 10
#S######.#
......#..#
.#.##.##.#
.#........
##.##.####
....#....#
.#######.#
....#.....
.####.###.
....#...G#

有不好的地方希望提出,谢谢。共同学习~

你可能感兴趣的:(算法)