实现BFS算法遇TypeError错误求助:'BFS'对象不可下标访问
BFS代码错误分析与修正
核心错误原因
self[current_node]是完全错误的写法:self是BFS类的实例,根本不支持下标访问([]操作)。题目明确要求用problem.successors(node)获取当前节点的后继节点,这里必须替换成这个方法。
其他多处问题
- 队列初始化错了:
queue = [problem]把问题实例塞进队列,完全没必要,应该初始化为空队列,再加入起始节点source_node。 - 集合操作错误:
visited是set()类型,没有append()方法,添加元素要用add()。 - 没加终止判断:BFS的核心逻辑是找到目标节点就停止,你现在会遍历所有节点,浪费资源还不符合要求。
- 没按要求用给定的Queue类:题目已经导入了
Queue,你却用列表模拟队列(pop(0)效率低,也不符合作业要求)。
修正后的完整代码
from .. problem import Problem from .. datastructures.queue import Queue # please ignore this def get_solver_mapping(): return dict(bfs=BFS) class BFS(object): def solve(self, problem: Problem): visited = set() # 记录已访问过的节点 queue = Queue() # 使用题目提供的Queue数据结构 source_node = problem.get_start_node() # 初始化:起始节点入队并标记已访问 visited.add(source_node) queue.enqueue(source_node) while not queue.is_empty(): # 队列非空时持续遍历 current_node = queue.dequeue() # 检查当前节点是否是终点,找到就直接返回 if problem.is_end(current_node): return current_node # 遍历当前节点的所有后继节点 for neighbour in problem.successors(current_node): if neighbour not in visited: visited.add(neighbour) queue.enqueue(neighbour) # 遍历完所有节点都没找到终点,返回None return None
关键修正说明
- 把
self[current_node]换成problem.successors(current_node):严格按照题目提示的方式获取后继节点,这是解决报错的核心。 - 改用题目提供的
Queue类:调用enqueue()入队、dequeue()出队、is_empty()判断队列状态,完全符合作业要求。 - 修正集合操作:用
visited.add(neighbour)替代错误的append(),符合集合的操作规范。 - 加入终止条件:每次取出节点后先检查是否是终点,找到就立即返回,这是BFS的标准逻辑(保证找到的是最短路径对应的节点)。
- 清理队列初始化:去掉错误的
problem元素,从起始节点开始正确初始化队列。
内容的提问来源于stack exchange,提问作者Bianca Danczul
相关产品推荐
相关产品推荐

