广度优先搜索(BFS+STL queue)实现

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


整体思路:从起点向四周同时前进,得到新的点(ABCD),然后在让新的点向各自的四个新的方向扩散,直到找到重点,程序结束

代码如下

#define  _CRT_SECURE_NO_WARNINGS 
#include 
#include 
#include 
#include 
using namespace std;
/************************************************************************/
/*                      广度优先搜索(bfs)                              */
/************************************************************************/
enum {ROW=7,COL=7};

int map[ROW][COL] = {
	{ 0, 0, 1, 0, 1, 0, 1 },
	{ 1, 0, 0, 1, 0, 0, 1 },
	{ 1, 0, 1, 0, 0, 1, 0 },
	{ 1, 0, 0, 1, 0, 0, 1 },
	{ 0, 0, 0, 1, 0, 0, 1 },
	{ 1, 0, 1, 0, 0, 0, 1 },
	{ 1, 0, 0, 0, 1, 0, 1 },
};
int dir[4][2] = {
	{ -1, 0 }, { 0, 1 }, { 1, 0 }, { 0, -1 }
};
int vis[ROW][COL] = { 0 };
struct Node
{
	int x;
	int y;
	int step;
	friend istream & operator>>(istream &is, Node &obj)
	{
		is >> obj.x >> obj.y;
		return is;
	}
	bool operator==(Node &obj)
	{
		if (this->x == obj.x&&this->y == obj.y)
			return true;//两者的坐标是一致的,就返回真值
		return false;//默认返回假
	}
};
int bfs(Node & fir, Node & dest)
{
	queue Q;
	Q.push(fir);
	vis[fir.x][fir.y] = true;
	while (!Q.empty())
	{
		Node cur =Q.front();
		if (cur == dest) return cur.step;
		Q.pop();
		for (int i = 0; i < 4; i++)
		{
			int new_x = cur.x + dir[i][0];
			int new_y = cur.y + dir[i][1];
			//检测下标是否越界,检测是否访问过,检测是否为障碍
			if (new_x >= 0 && new_x < ROW&&new_y >= 0 && new_y < COL&&!vis[new_x][new_y] && !map[new_x][new_y])
			{
				Node new_node = { new_x, new_y,cur.step+1};
				Q.push(new_node);//将合理的点放到队列末尾
				vis[new_x][new_y] = true;
			}
		}
	}
	return 0;
	

}
void init()
{
	memset(vis, 0, sizeof(vis));
	for (int i = 0; i < ROW; i++)
	for (int j = 0; j < COL; j++)
	{
		if (map[i][j] == 2)
			map[i][j] = 0;
	}
}
void print_map()
{
	for (int i = 0; i < ROW; i++)
	{
		for (int j = 0; j < COL; j++)
			std::cout << map[i][j] << " ";
		std::cout << std::endl;
	}
}
int main(void)
{
	init();
	print_map();
	Node fir;
	Node dest;
	cin >> fir >> dest;
	fir.step = 1;
	int step = 0;
	if (map[fir.x][fir.y] && map[dest.x][dest.y])
	{
		cout << "输入点在障碍物上!" << endl;
	}
	else if (step=bfs(fir, dest))
	{
		cout << "找到最短路径!"<


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