Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #! /usr/bin/python
- import sys, new
- #prepare
- class lst(list):
- def swap(self, i, j):
- self[i], self[j] = self[j], self[i]
- def reverseFrom(self, at):
- x = at + (len(self)-at)/2
- j = len(self)-1
- for i in xrange(at, x):
- self.swap(i, j)
- j -= 1
- arr, n = lst(), int(sys.argv[1])
- for i in xrange(n):
- arr.append(i+1)
- #permutation
- def nextPerm(seq):
- i = len(seq) - 2
- while seq[i] > seq[i+1]: #search 'jump' when next element is lesser
- i -= 1 #(searching from end, but it isn't matter)
- if i < 0:
- break #no jump - permutation lexicographic maximal
- if i >= 0:
- j = len(seq) - 1
- while seq[i] > seq[j]: #search larger element then el. on our 'jump'
- j -= 1
- seq.swap(i, j) #swap them
- seq.reverseFrom(i+1) #reverse 'tail' - all elements after earlier 'jump'
- return True #return true if exist next lexicographic permutation
- seq.reverseFrom(0) #reverse all sequence becouse it's maximal
- return False #return false if next permutation is lexicographic minimal
- #print all permutations
- do, i = True, 0
- while do:
- sys.stdout.write(str(i) + ')\t' + str(arr) + '\n') #just print
- i += 1
- do = nextPerm(arr) #compute next permutation of sequence and get
- #boolean - is one the largest?
- print 'last:\t', arr
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement