【单选】下图为 5×5 网格,行号、列号均从 0 开始,# 为障碍,. 为可通行格。从 S 出发做广度优先搜索(BFS):初始时把 S 入队;每次取出队首格子,按“上、下、左、右”的顺序遍历它的四个相邻格子,越界、障碍或已访问的格子跳过,其余格子标记为已访问并入队。当 E 第一次入队时,已经入队过的格子(含 S 和 E)共有多少个( )。
严格按题面给的顺序"上、下、左、右"模拟 BFS 队列,把每次新入队的格子编号(1 是 S)。注意"E 第一次入队"就是问 E 是第几个被入队的格子。
把邻居顺序改成常见的"上下左右"之外(如先左右后上下)导致编号错位;或把已访问标记放在出队时才做,造成重复入队;也容易忘掉"S 和 E 自身都算"。
在一张 5×5 的网格上,从起点 S 出发做广度优先搜索(BFS),按题目规定的“上、下、左、右”顺序扩展邻居。问的是:当终点 E 第一次被放入队列时,从开始到此刻,队列里一共放进去过多少个格子(S 和 E 都要算上)?
行号、列号从 0 开始,障碍(#)位于 (0,3)、(1,3)、(2,3)、(3,0)、(3,1)、(4,3),S 在 (0,0),E 在 (3,4):
行\列 0 1 2 3 4
0 S . . # .
1 . . . # .
2 . . . # .
3 # # . . E
4 . . . # .邻居按 上、下、左、右 顺序考察;越界 / 障碍 / 已访问一律跳过;被访问的格子标记并入队。
把每次新入队的格子依次编号(S 是第 1 个)。下面每一行记:这一轮“出队的是谁”,以及按“上、下、左、右”新入队了谁(跳过越界、障碍、已访问):
| 出队格 | 本轮按“上、下、左、右”新入队 |
|---|---|
| (0,0) S=① | 下(1,0)=②、右(0,1)=③ |
| (1,0)=② | 下(2,0)=④、右(1,1)=⑤ |
| (0,1)=③ | 右(0,2)=⑥(上越界;下(1,1)已访问;右(0,3)是障碍——都跳过) |
| (2,0)=④ | 右(2,1)=⑦(下(3,0)是障碍,跳过) |
| (1,1)=⑤ | 右(1,2)=⑧ |
| (0,2)=⑥ | 无新格(右是障碍,下已访问) |
| (2,1)=⑦ | 右(2,2)=⑨(下(3,1)是障碍,跳过) |
| (1,2)=⑧ | 无新格(右是障碍) |
| (2,2)=⑨ | 下(3,2)=⑩(右是障碍) |
| (3,2)=⑩ | 下(4,2)=⑪、右(3,3)=⑫ |
| (4,2)=⑪ | 左(4,1)=⑬(右是障碍) |
| (3,3)=⑫ | 右 (3,4)=E=⑭ |
E 第一次入队时编号为 14,即“已经入队过的格子(含 S 和 E)”共 14 个,选 C。