Nombre maximum de dames sur un échiquier

Au club d'échecs du coin, la question m'a été posée. Combien peut-on mettre de dames au maximum sur un échiquier sans qu'elles se mangent ? La réponse est relativement simple. Là où ça se corse est la deuxième question. Combien y a-t-il de solutions ? J' ai voulu partir avec des bases simple en commençant avec un damier de 1 case puis 4 puis 9 mais la progression arithmétique est loin d’être triviale.
N cases, N reine max, N solutions
1________1__________1
4________1__________4
9________2__________6
16_______4__________2
25_______5__________6
Cordialement.?

Réponses

  • Bonjour,

    Voilà un code Python (ne pas tester avec $n$ trop grand, sauf si tu as le temps):
    ###################################################################
    # Problème des tours et des reines sur un échiquier 
    # Rescassol - 20 Janvier 2018
    ###################################################################
    
    ###################################################################
    # Importations
    ###################################################################
    
    import numpy as np
    import itertools as it
    
    from time import clock
    
    ###################################################################
    # Fonctions
    ###################################################################
    
    def TestReines(A):
        n=len(A)
        B=np.dot(A,J)
        for k in range(-n+1,n):
            if sum(np.diag(A,k))>1:
                 return False
            if sum(np.diag(B,k))>1:
                 return False
        return True
        
    ###################################################################
    # Script principal de test
    ###################################################################
    
    # initialisations
    
    n=8 # Peut être paramétré
    cpt=0
    A=np.zeros((n,n),int)
    J=np.zeros((n,n),int)
    for k in range(n):
        J[k,n-k-1]=1
    L=list(it.permutations(range(n)))
    
    # Calculs et affichage des résultats
    
    t=clock()
    for P in L:
        A=np.zeros((n,n),int)
        for k in range(n): # Génération des n! matrices candidates
            A[k,P[k]]=1
        if TestReines(A):  # Les tours sont elles des reines ?
            print(A,'\n')
            cpt+=1
    
    print('Il y a',cpt,'configurations possibles')
    print('Temps mis pour les trouver: ',round(clock()-t,3),'secondes')
    


    Pour $8$ reines sur un échiquier classique, il y a $92$ solutions.

    Cordialement,

    Rescassol
  • Bonjour,

    Peut être intéressant : un jeu interactif avec 8 dames sur un échiquier classique
    http://rdassonval.free.fr/flash/reines.swf
  • Je n'y connais rien en Python
    NameError: name 'L' is not defined
    Ma version.
    Python 2.7.9

    Quant au flash j'ai pas encore réussi à l'ouvrir.
    Je suis en Debian.
  • @Fly7 : si tu n'y connais vraiment rien, la première source d'erreur potentielle est un copier-coller ne respectant pas l'indentation ! Le code de Rescassol tourne chez-moi sous python 3.
  • Bonjour,

    Je suis en Python 3.4.5. Les versions 2 sont obsolètes, ou tout au moins ne seront pas maintenues.

    Cordialement,

    Rescassol
    .
  • Une vidéo pour présenter mon jeu
    https://www.youtube.com/watch?time_continue=2&v=C97EjZ4GsBI
    Y a bien un joueur du club du coin qui a un PC (même un vieux(:P)) avec un WINDOWS (c'est pas bien(:P)) et un player FLASH (c'est dangereux(:P))...
  • Dès que j'aurai davantage de temps, je vous confirmerai le bon fonctionnement de FLASH et Python.
    Dès que mon vieux disque dur se sera mis à fonctionner.
  • Fly7, soit tu tapes python3 ton code.py soit tu insères #!/usr/bin/python3 au tout début de ton code.
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
Connectez-vous ou Inscrivez-vous pour répondre.