def SJTperms(a, dirs): n = len(a) id = -1 for i in range(n): # can check mobility mobile largest mobile if (0<=i+dirs[i]<n) and (a[i] > a[i+dirs[i]]) and ((id == -1) or (a[i] > a[id])): id = i if (id == -1): #last permutation return False for i in range(n): if a[i] > a[id]: dirs[i] = - dirs[i] #swap elements AND their directions a[id], a[id + dirs[id]] = a[id + dirs[id]], a[id] t = dirs[id] dirs[id], dirs[id + t] = dirs[id + t], dirs[id] return True a = [1,2,3,4] d = [-1]*len(a) cont = True while cont: print(a) #print(d) cont = SJTperms(a, d)
Standard input is empty
[1, 2, 3, 4] [1, 2, 4, 3] [1, 4, 2, 3] [4, 1, 2, 3] [4, 1, 3, 2] [1, 4, 3, 2] [1, 3, 4, 2] [1, 3, 2, 4] [3, 1, 2, 4] [3, 1, 4, 2] [3, 4, 1, 2] [4, 3, 1, 2] [4, 3, 2, 1] [3, 4, 2, 1] [3, 2, 4, 1] [3, 2, 1, 4] [2, 3, 1, 4] [2, 3, 4, 1] [2, 4, 3, 1] [4, 2, 3, 1] [4, 2, 1, 3] [2, 4, 1, 3] [2, 1, 4, 3] [2, 1, 3, 4]