Python如何从单个列表生成多个不同列表 修复8数码问题节点重复错误
问题根源
swap_positions函数是原地修改传入的列表对象,两次调用都操作同一个initial_state实例:第一次调用已经把原始初始状态修改为右移后的结果,第二次调用是在修改后的列表基础上做交换,最终两次返回的都是第二次修改后的结果。find_new_nodes函数没有使用传入的state参数,硬编码引用了全局的initial_state,无法适配后续不同状态的扩展需求。- 全局变量
loc_of_zero的使用逻辑耦合度过高,后续多状态扩展时极易出现位置取值错误。
修复方案
每次生成新状态前,先对原始状态做拷贝,基于拷贝对象做交换操作,完全避免修改原始状态。同时去掉不必要的全局变量,将0的位置查询逻辑放到节点扩展函数内部,增强代码复用性。
修改后完整代码
initial_state = [0,1,3,4,2,5,7,8,6] goal_state = [1,2,3,4,5,6,7,8,0] def swap_positions(state, pos1, pos2): # 先拷贝原始状态,不修改原对象 new_state = state.copy() new_state[pos1], new_state[pos2] = new_state[pos2], new_state[pos1] return new_state def find_new_nodes(state): loc_of_zero = state.index(0) new_nodes = [] # 索引0对应3x3网格的左上角,合法移动为右移(索引+1)、下移(索引+3) if loc_of_zero == 0: right = swap_positions(state, 0, 1) down = swap_positions(state, 0, 3) new_nodes.append(right) new_nodes.append(down) # 后续可补充其他位置的合法移动判断逻辑 return new_nodes print(find_new_nodes(initial_state))
运行输出
[[1, 0, 3, 4, 2, 5, 7, 8, 6], [4, 1, 3, 0, 2, 5, 7, 8, 6]]
内容的提问来源于stack exchange,提问作者Dominos-roadster
相关产品推荐
相关产品推荐

