"""
    Résolution du problème des N-Reines en passant
    en revue toutes les permutations possibles

    Pour chaque permutation (appelée xs) on
    évalue les diagonales occupées :
    - diagonales droites ou positives : y+x
    - diagonales gauches ou negatives : y-x
"""

from itertools import permutations
import time
import sys


# nombre de reines initial peut être modifié en appelant
# le programme avec un argument entier
N = 6

# nombre de permutations calculées : doit être égal à N!
nbr_permutations = 0
 
def resoudre(n):
    """
        Résolution du problème des N-Reines
        en passant en revue toutes les permutations possibles
    """
    global nbr_permutations

    # lignes : ys = [0,1,...,N-1]
    ys = range(n)

    # pour chaque permutation
    for xs in permutations(ys):
        nbr_permutations = nbr_permutations + 1
        # on compte les diagonales occupées
        diag_pos = set(y + xs[y] for y in ys)
        diag_neg = set(y - xs[y] for y in ys)
    
        if n == len(diag_pos) == len(diag_neg):
            yield xs



def main():
    """
        Fonction principale
    """
    global N

    if len(sys.argv) > 1:
        N = int(sys.argv[1])


    # chronométrage du temps de calcul
    t1 = time.time()
    liste_solutions = list(resoudre(N))
    ns = len(liste_solutions)
    t2 = time.time()

    print(f"nombre de reines={N}")
    print(f"permutations={nbr_permutations}")
    print(f"solutions={ns}")
    print(f"temps de calcul={t2-t1}s")

if __name__ == "__main__":
    main() 