广度优先搜索(Breadth First
Search):英文缩写为(BFS),是一种用于搜索树或图的算法。从起始节点开始逐层扩展搜索,直到达到目标节点。它以广度的方式探索图中的节点,即先访问离起始节点最近的节点,然后逐渐扩展到距离更远的节点。
广度优先搜索的实现:
- 将起始节点放入队列中,并将其标记为已访问。
- 从队首取出一个节点作为当前节点。
- 遍历当前节点的所有邻居节点:如果邻居节点没有被访问过,则将其放入队列中并标记为已访问。
- 重复步骤2和3,直到队列为空或找到目标节点。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| char mp[N][N]; step step[N][N]; queue<pair<int, int> > q; int dir[4][2] = { 0, 1, 0, -1, 1, 0, -1, 0 }
fill(step[0], step[0] + N * N, -1)
void bfs(int sx, int sy) { q.push({sx, sy}); step[sx][sy] = 0; while(!q.empty()) { int x = q.front().first; int y = q.front().second; q.pop();
if (x, y) 是终点 { break; }
for(int i = 0; i < 4; i++) { int nx = x + dir[i][0]; int ny = y + dir[i][1]; if(nx < 0 || nx >= n || ny < 0 || ny >= m) continue; if(mp[nx][ny] 是障碍 || step[nx][ny] != -1) continue; q.push({nx, ny}); step[nx][ny] = step[x][y] + 1; } } }
|
特别注意:要在入队时就对节点进行标记,如果在出队时标记,两个点都指向某个未访问的节点时,它会被重复入队。