Esta no es necesariamente la mejor opción, pero es una solución válida y ciertamente vale la pena conocerla, ya que es un algoritmo realmente útil: la próxima permutación. Ver permutación
def next_permutation(elems):
elems = list(elems)
N = len(elems) for k in range(N-2, -1, -1):
if elems[k] < elems[k+1]:
break
else:
raise StopIteration for l in range(N-1, -1, -1):
if elems[k] < elems[l]:
break elems[k], elems[l] = elems[l], elems[k]
elems[k+1:] = reversed(elems[k+1:]) return elems def all_permutations(elems):
elems = sorted(elems)
while True:
yield elems
elems = next_permutation(elems) for permutation in all_permutations([2, 3, 1]):
print(permutation)
def next_permutation(elems):
elems = list(elems)
N = len(elems) for k in range(N-2, -1, -1):
if elems[k] < elems[k+1]:
break
else:
raise StopIteration for l in range(N-1, -1, -1):
if elems[k] < elems[l]:
break elems[k], elems[l] = elems[l], elems[k]
elems[k+1:] = reversed(elems[k+1:]) return elems def all_permutations(elems):
elems = sorted(elems)
while True:
yield elems
elems = next_permutation(elems) for permutation in all_permutations([2, 3, 1]):
print(permutation)
def next_permutation(elems):
elems = list(elems)
N = len(elems) for k in range(N-2, -1, -1):
if elems[k] < elems[k+1]:
break
else:
raise StopIteration for l in range(N-1, -1, -1):
if elems[k] < elems[l]:
break elems[k], elems[l] = elems[l], elems[k]
elems[k+1:] = reversed(elems[k+1:]) return elems def all_permutations(elems):
elems = sorted(elems)
while True:
yield elems
elems = next_permutation(elems) for permutation in all_permutations([2, 3, 1]):
print(permutation)
def next_permutation(elems):
elems = list(elems)
N = len(elems) for k in range(N-2, -1, -1):
if elems[k] < elems[k+1]:
break
else:
raise StopIteration for l in range(N-1, -1, -1):
if elems[k] < elems[l]:
break elems[k], elems[l] = elems[l], elems[k]
elems[k+1:] = reversed(elems[k+1:]) return elems def all_permutations(elems):
elems = sorted(elems)
while True:
yield elems
elems = next_permutation(elems) for permutation in all_permutations([2, 3, 1]):
print(permutation)
def next_permutation(elems):
elems = list(elems)
N = len(elems) for k in range(N-2, -1, -1):
if elems[k] < elems[k+1]:
break
else:
raise StopIteration for l in range(N-1, -1, -1):
if elems[k] < elems[l]:
break elems[k], elems[l] = elems[l], elems[k]
elems[k+1:] = reversed(elems[k+1:]) return elems def all_permutations(elems):
elems = sorted(elems)
while True:
yield elems
elems = next_permutation(elems) for permutation in all_permutations([2, 3, 1]):
print(permutation)
def next_permutation(elems):
elems = list(elems)
N = len(elems) for k in range(N-2, -1, -1):
if elems[k] < elems[k+1]:
break
else:
raise StopIteration for l in range(N-1, -1, -1):
if elems[k] < elems[l]:
break elems[k], elems[l] = elems[l], elems[k]
elems[k+1:] = reversed(elems[k+1:]) return elems def all_permutations(elems):
elems = sorted(elems)
while True:
yield elems
elems = next_permutation(elems) for permutation in all_permutations([2, 3, 1]):
print(permutation)
def next_permutation(elems):
elems = list(elems)
N = len(elems) for k in range(N-2, -1, -1):
if elems[k] < elems[k+1]:
break
else:
raise StopIteration for l in range(N-1, -1, -1):
if elems[k] < elems[l]:
break elems[k], elems[l] = elems[l], elems[k]
elems[k+1:] = reversed(elems[k+1:]) return elems def all_permutations(elems):
elems = sorted(elems)
while True:
yield elems
elems = next_permutation(elems) for permutation in all_permutations([2, 3, 1]):
print(permutation)
que produce
[1, 2, 3]
[1, 3, 2]
[2, 1, 3]
[2, 3, 1]
[3, 1, 2]
[3, 2, 1]
Puede usar esto para resolver su problema enumerando todas las permutaciones de la lista
['R'] * N + ['D'] * N
donde ‘R’ representa un movimiento hacia la derecha y ‘D’ representa un movimiento hacia abajo, lo que produce una secuencia de movimientos que corresponde a un camino. Luego puede convertir esto a su lista de waypoints.