广度优先遍历(解决选课的烦恼程序)
广度优先遍历也是从某个状态出发查询可以达到的所有状态,总是先去查询距离初始状态最近的状态。
问题:
小郎正在面临选课的问题,我们要学习计算机基础、数学、英语、算法、Java等五门课程,其中学习算法前需要先学习Java、英语,学Java前又需要学数学和计算机基础,那么小郎该如何选课?
选课图:
解决问题
我们先给每门课设置一个编号,编号从0卡死hi。先选课的关系如何表达呢,课程与课程间的依赖关系以一个二维数组的形式给出,如下图。例如数组中第一行第三列的1表示课程0是课程2的先修课。
课程间的依赖关系图:
开始选课时,小郎只能选择没有先修课的科目,比如先选数学,然后在选择计算机基础,这样一来,就可以学Java了。为了找出没有先修课的科目,需要建立一个数组来记录每门课的先修课数量,将每门课的先修课数量初始值为0,课程数量为numCourses。
python中数组也叫列表。
接着,需要通过先修课的二维数组preList来计算每门课的先修课数量,代码如下:
for line in preList: #取出二维数组中的每一行
for i in range(len(line)): #针对每一行来为preListCount赋值
if line[i] == 1:
preListCount[i] += 1
经过计算,可以得出每门课的先修课数量,如下图:
接下来,建立一个队列canTake存储目前