红色是障碍物 蓝色是起点 右下角是终点 BFS总之就像洪水一样 吞噬蔓延附近的白色方块
第一个到的 就是最近的
BFS需要用到:
表示方向的数组:下左右上
int dx[4] = { -1,1,0,0 };
int dy[4] = { 0,0,-1,1 };
1.队列:C++STL queue 先进先出(排队吃饭)
2.结构
struct node
{
int x, y, step;
};通常会有这样一个结构,这道题不需要step,有的题目会问你最短的步数是多少,下面再说
然后queue<node>q;
完成了对地图的输入之后,来到bfs函数
一个标准的模板 :标记开始位置 开始位置入队 当队列不空的时候 取出队列前面的元素
对此点 延申
当然不是任何位置都延申
比如左上角点可以向下 向右 把这两个位置加入队列
来到下面哪个蓝色块 只能向右 向下 向左越界了 向上的话:额额没有意义
if (nnx <= 0 || nny <= 0 || nnx > n || nny > m||vis[nnx][nny])continue;所以才有了这句话
还有一种情况 遇到障碍物 你就写if(map[nnx][nny]==障碍)continue;
此时我们的位置是 (a.x,a.y)通过方向数组 -->>(nnx,nny) 这个位置越界 标记过 就continue
如果可以的话就入队,标记
这个for循环走完了之后 回到while(!q.empty())取出队首元素 判断队首x,y坐标是否达到终点坐标
map[nnx][nny] == 0 && vis[nnx][nny] == 0
给出模板代码
void bfs(int x, int y)
{
vis[x][y] = 1;
q.push(node{ x,y,0 });
while (!q.empty())
{
node a = q.front();
q.pop();
if (a.x == endx && a.y == endy)
{
cout << "yes" << endl;
//cout<<a.step<<endl;
return;
}
for (int i = 0; i < 4; i++)
{
int nnx = a.x + dx[i];
int nny = a.y + dy[i];
int ns = a.step + 1;
if (nnx <= 0 || nny <= 0 || nnx > n || nny > m)continue;
if (map[nnx][nny] == 0 && vis[nnx][nny] == 0)
{
vis[nnx][nny] = 1;
q.push(node{ nnx,nny,ns});
}
}
}
cout << "no" << endl;
}