You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python如何从单个列表生成多个不同列表 修复8数码问题节点重复错误

问题根源
  1. swap_positions 函数是原地修改传入的列表对象,两次调用都操作同一个initial_state实例:第一次调用已经把原始初始状态修改为右移后的结果,第二次调用是在修改后的列表基础上做交换,最终两次返回的都是第二次修改后的结果。
  2. find_new_nodes 函数没有使用传入的state参数,硬编码引用了全局的initial_state,无法适配后续不同状态的扩展需求。
  3. 全局变量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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 00:45:09