from functools import reduce

# Les N reines

def list_of_int(n):
    return [ i for i in range(1, n+1)]

def succ_list(l) :
    return list(map (lambda x:x+1,l))

def pred_list(l) :
    return list(map (lambda x:x-1,l))

def diff(l1,l2):
    return list(filter (lambda x: not (x in l2), l1))

def remove(x,l):
    return list(filter(lambda y: y != x,l))

def nb_solutions(a, b, c):
    if a==[]:
        return 1
    else:
        e = diff (diff(a, b), c)
        return reduce (lambda acc,d: acc +\
                       nb_solutions (remove(d,a), succ_list(b+[d]),\
                                     pred_list(c+[d])),e,0)

def reines(n):
    return nb_solutions (list_of_int(n), [], [])

print(reines(8))
