代码之家  ›  专栏  ›  技术社区  ›  evilGenious

从栅格中删除对角线

  •  0
  • evilGenious  · 技术社区  · 7 年前

    我正在尝试用python创建一个高度为5、宽度为10的图形。到目前为止,我有一段代码,它构造了一个图形,该图形具有对角线的边以及图形中的上、左、右和下边:

    def construct_graph(data):
    # initialize all of the astar nodes
    nodes = [[ANode(x, y) for y in range(data['height'])] for x in range(data['width'])]
    graph = {}
    # make a graph with child nodes
    for x, y in product(range(data['width']), range(data['height'])):
        node = nodes[x][y]
        graph[node] = []
        for i, j in product([-1, 0, 1], [-1, 0, 1]):
            if not (0 <= x + i < data['width']): continue
            if not (0 <= y + j < data['height']): continue
            if [x+i,y+j] in data['obstacle']: continue
            graph[nodes[x][y]].append(nodes[x+i][y+j])
    return graph, nodes
    

    如何修改上述函数以仅创建上、左、右和下链接?

    注意:ANode只是一个普通的python类,它存储 x, y 对于节点。

    1 回复  |  直到 7 年前
        1
  •  0
  •   javidcf    7 年前

    不使用 product 对于内部循环,只需指定所需的邻居:

    def construct_graph(data):
    # initialize all of the astar nodes
    nodes = [[ANode(x, y) for y in range(data['height'])] for x in range(data['width'])]
    graph = {}
    # make a graph with child nodes
    for x, y in product(range(data['width']), range(data['height'])):
        node = nodes[x][y]
        graph[node] = []
        for i, j in [(-1, 0), (0, -1), (0, 1), (1, 0)]:
            if not (0 <= x + i < data['width']): continue
            if not (0 <= y + j < data['height']): continue
            if [x+i,y+j] in data['obstacle']: continue
            graph[nodes[x][y]].append(nodes[x+i][y+j])
    return graph, nodes