宽度优先搜索算法(又称广度优先搜索)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型。Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想。其别名又叫BFS,属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止。
整体思路:从起点向四周同时前进,得到新的点(ABCD),然后在让新的点向各自的四个新的方向扩散,直到找到重点,程序结束
代码如下
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <queue>
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<Node> 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 << "找到最短路径!"<<step << endl;
}
else
{
cout << "找不到所要求路径!" << endl;
}
cout << endl;
system("pause");
return 0;
}