Les 8 dames .
Le problème
On veut placer 8 dames sur un échiquier 8 sur 8 de façon à ce qu'aucune dame ne puisse en prendre une autre.
On rappelle que deux dames ne sont pas en prise si elles ne sont pas sur une même rangée, c'est à dire si elles ne sont pas sur une
même ligne, une même colonne ou une même diagonale.
Une représentation
On se propose d'obtenir les solutions sous la forme d'une chaîne de caractères telle que la suivante : '*15863724'.
Cette chaîne est à interpréter ainsi : la reine de la colonne 1 est en ligne 1, la reine de la colonne 2 est en ligne 5,
la reine de la colonne 3 est en ligne 8...
L'étoile en début de chaîne ne sert qu'à numéroter plus "naturellement" les colonnes de 1 à 8 (plutôt que de commencer
à l'indice 0).
On propose par ailleurs un affichage simple d'une telle solution :
def affiche(solu) :
"""
Affichage d'une solution.
La solution solu donnée en argument est sous la forme '*235...'
"""
print(' ',end=' ')
for k in range(1,9) : print(k,end='|')
print()
for l in range(1,9) :
print(l,end='|')
for c in range(1,9) :
if solu[c]==str(l) :
print('R',end='|')
else :
print(' ',end='|')
print()
affiche('*15863724')
ce qui donne :
1|2|3|4|5|6|7|8| 1|R| | | | | | | | 2| | | | | | |R| | 3| | | | |R| | | | 4| | | | | | | |R| 5| |R| | | | | | | 6| | | |R| | | | | 7| | | | | |R| | | 8| | |R| | | | | |
Un exemple de programme.
def ok(c) :
""" c='*25456812' signifie
reine colonne 1, ligne 2;
reine colonne 2, ligne 5;
reine colonne 3, ligne 4...
Retourne True si reines non en prise."""
for j in range(2,9) :
for i in range(1,j) :
if c[i]==c[j] : return False
elif i+int(c[i])==j+int(c[j]) : return False
elif i-int(c[i])==j-int(c[j]) : return False
return True
def reine() :
SOLUTIONS=[] # contiendra les solutions
L=['1','2','3','4','5','6','7','8'] # noms des colonnes
for a1 in L :
for a2 in L :
for a3 in L :
for a4 in L :
for a5 in L :
for a6 in L :
for a7 in L :
for a8 in L :
sol='*'+a1+a2+a3+a4+a5+a6+a7+a8
if ok(sol) : SOLUTIONS.append(sol)
return SOLUTIONS
Liste=reine()
print("Nombre de solutions :", len(Liste))
affiche(Liste[0]) # grille correspondant à la première solution de la liste
On obtient :
Nombre de solutions : 92 1|2|3|4|5|6|7|8| 1|R| | | | | | | | 2| | | | | | |R| | 3| | | | |R| | | | 4| | | | | | | |R| 5| |R| | | | | | | 6| | | |R| | | | | 7| | | | | |R| | | 8| | |R| | | | | |
Question
Après avoir réfléchi au fonctionnement du programme proposé, chercher à l'améliorer en utilisant continue
.
L'objectif est d'éviter un certain nombre de calculs inutiles.
A l'aide de compteurs, comparer le programme initial et votre proposition.