""" 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()