47 lines
882 B
Python
47 lines
882 B
Python
try:
|
|
import psyco
|
|
psyco.full()
|
|
except ImportError:
|
|
pass
|
|
|
|
best = [0] * 16
|
|
|
|
def try_swaps(deck, f, s, d, n):
|
|
if d > best[n]:
|
|
best[n] = d
|
|
|
|
i = 0
|
|
k = 1 << s
|
|
while s:
|
|
k >>= 1
|
|
s -= 1
|
|
if deck[s] == -1 or deck[s] == s:
|
|
break
|
|
i |= k
|
|
if (i & f) == i and d + best[s] <= best[n]:
|
|
return d
|
|
s += 1
|
|
|
|
deck2 = list(deck)
|
|
k = 1
|
|
for i2 in xrange(1, s):
|
|
k <<= 1
|
|
if deck2[i2] == -1:
|
|
if f & k: continue
|
|
elif deck2[i2] != i2:
|
|
continue
|
|
|
|
deck[i2] = i2
|
|
deck2[:i2 + 1] = reversed(deck[:i2 + 1])
|
|
try_swaps(deck2, f | k, s, 1 + d, n)
|
|
|
|
def topswops(n):
|
|
best[n] = 0
|
|
deck0 = [-1] * 16
|
|
deck0[0] = 0
|
|
try_swaps(deck0, 1, n, 0, n)
|
|
return best[n]
|
|
|
|
for i in xrange(1, 13):
|
|
print "%2d: %d" % (i, topswops(i))
|