Exemple #1
0
def create_labyrinth(rows: int, cols: int, n: int = 0) -> UndirectedGraph:
    vertices = [(r, c) for r in range(rows) for c in range(cols)]

    mfs = MergeFindSet()
    for v in vertices:
        mfs.add(v)

    edges = []
    for r, c in vertices:
        if r + 1 < rows:
            edges.append(((r, c), (r + 1, c)))
        if c + 1 < cols:
            edges.append(((r, c), (r, c + 1)))

    random.shuffle(edges)

    corridors = []

    for (u, v) in edges:
        if mfs.find(u) != mfs.find(v):
            corridors.append((u, v))
            mfs.merge(u, v)
        elif n > 0:
            corridors.append((u, v))
            n -= 1

    return UndirectedGraph(E=corridors)
Exemple #2
0
def create_labyrinth(rows, cols):
    # generar vertices
    vertices = [(row, col) for row in range(rows) for col in range(cols)]

    mfs = MergeFindSet()
    edges = []

    for v in vertices:
        mfs.add(v)

    # anadir la fila de abajo y la columna derecha a la lista de aristas y barajarla
    for row, col in vertices:
        if row + 1 < rows:
            edges.append(((row, col), (row + 1, col)))
        if col + 1 < cols:
            edges.append(((row, col), (row, col + 1)))

    # borrar las aristas prohibidas
    edges = list(set(edges) - set(aristas_p))

    random.shuffle(edges)

    corridors = []

    for u, v in edges:
        if mfs.find(u) != mfs.find(v):
            mfs.merge(u, v)
            corridors.append((u, v))

    return corridors, vertices
Exemple #3
0
def prim2(v_ini, aristas_prim):
    aristas_ordenadas = []
    for arista, w in sorted(aristas_prim.items(), key=lambda x: x[1]):
        aristas_ordenadas.append(arista)

    mfs = MergeFindSet()
    g_prim = UndirectedGraph(E=aristas_ordenadas)

    path = []

    for v in range(len(puntos)):
        mfs.add(v)

    seen = set()
    q = Fifo()

    q.push(v_ini)
    seen.add(v_ini)

    menor_arista = menor_arista_iter(v_ini, g_prim, aristas_prim)
    aristas_vecinas_ordenadas = []
    for i in menor_arista:
        aristas_vecinas_ordenadas.append(i)
    # print(aristas_vecinas_ordenadas)
    while len(q) > 0:
        u = q.pop()

        for suc in g_prim.succs(u):
            if suc not in seen:
                seen.add(suc)
                q.push(suc)

        # if mfs.find(u) != mfs.find(v):  # no hace ciclo
        #     seen.add(u,v)

    return path, g_prim
Exemple #4
0
def create_labyrinth(rows: int, cols: int, n: int = 0) -> UndirectedGraph:
    # Definition

    # Step 1
    vertices = [(r, c) for r in range(rows) for c in range(cols)]

    # Step 2
    mfs = MergeFindSet()
    for v in vertices:
        mfs.add(v)

    # Step 3
    edges = []
    for (r, c) in vertices:
        if r + 1 < rows:
            edges.append(((r, c), (r + 1, c)))
        if c + 1 < cols:
            edges.append(((r, c), (r, c + 1)))
    random.shuffle(edges)

    # Step 4
    corridors = []
    discarted_edges = []  #modificacion

    # Step 5
    for (u, v) in edges:
        if mfs.find(u) != mfs.find(v):
            mfs.merge(u, v)
            corridors.append((u, v))
        else:
            discarted_edges.append((u, v))  #modificacion

    corridors.extend(discarted_edges[:n])  #modificacion

    # Step 6
    return UndirectedGraph(E=corridors)
def create_labyrinth(rows, cols, n=0):
    # for i in range(rows):
    #     for j in range(cols):
    #         vertices.append((i, j))

    vertices = [(row, col) for row in range(rows)
                for col in range(cols)]

    print(vertices)

    mfs = MergeFindSet()

    for elem in vertices:
        mfs.add(elem)

    edges = []
    for row, col in vertices:
        if row+1 < rows:
            edges.append(((row, col), (row+1, col)))
        if col+1 < cols:
            edges.append(((row, col),(row, col+1)))

    shuffle(edges)

    contador = 0
    corridors = []
    for u, v in edges:

        if mfs.find(u) != mfs.find(v):
            mfs.merge(u, v)
            corridors.append((u, v))
        elif n > contador:
            corridors.append((u, v))
            contador+=1

    return UndirectedGraph(E=corridors)