Bonjour,
je dois créer un algorithme permettant, sur un échequier de 8x8, de placer 8 reines qui ne se menacent pas. Pour ce faire j’ai suivant le methode de resolution ici: http://zanotti.univ-tln.fr/ALGO/I51/Reines.html?fbclid=IwAR0N3QXDU94ZEk3YhGZ8onYzlUqJaJ7HEMS2-liI4f0vXL-2SCkp_j7D8Qk
import matplotlib.pyplot as plt
import random
#fonctions
def pointban(x,y): #supprime les cases menacees de la liste "dispo"
for i in point:
for j in dispo:
if (x,i)==j:
dispo.remove((x,i))
for j in dispo:
if (i,y)==j:
dispo.remove((i,y))
a,b=x-1,y-1
while 1<=a<=8 and 1<=b<=8:
for j in dispo:
if (a,b)==j:
dispo.remove((a,b))
a=a-1
b=b-1
a,b=x-1,y+1
while 1<=a<=8 and 1<=b<=8:
for j in dispo:
if (a,b)==j:
dispo.remove((a,b))
a=a-1
b=b+1
a,b=x+1,y-1
while 1<=a<=8 and 1<=b<=8:
for j in dispo:
if (a,b)==j:
dispo.remove((a,b))
a=a+1
b=b-1
a,b=x+1,y+1
while 1<=a<=8 and 1<=b<=8:
for j in dispo:
if (a,b)==j:
dispo.remove((a,b))
a=a+1
b=b+1
def pointdeban(): #refait la liste des points dispo après avoir supprime une reine dans la liste "Rei"
dispo=[]
for i in point:
for j in point:
dispo.append((i,j))
for (a,b) in Rei:
pointban(a,b)
def verif(x,y): #verifie si une point appartient a la liste "dispo"
for (a,b) in dispo:
if (x,y)==(a,b):
return True
return False
def reine(l): #place les reines de maniere a ce qu'elle ne se menacent pas
while len(Rei)<n: #tant que je n'ai pas n reines dans la liste "Rei"
taille=len(Rei) #je mets la taille initiale de liste "Rei" en memoire
print('taille ini :',taille)
rang=rligne[l-1] #rang prends la liste des cases a tester sur la ligne "l"
print('Rei :',Rei)
while len(rang)>0: #tant qu'il y a des cases a tester
p=rang[random.randint(0,(len(rang)-1))] #je prends un nombre aleatoire dans la liste des cases a tester
print(l,p)
print('dispo :',dispo)
print('rang :',rang)
if verif(l,p)==True: #je regarde si (l,p) appartient a la liste des cases disponible "dispo"
print('Yes')
Rei.append((l,p)) #si c'est le cas, je l'ajoute a la liste des reines "Rei"
rang=rligne[l-1] #je reprends la liste initiale des cases a tester sur la ligne "l" puis je supprime la colonne "p" pour ne pas la retester plus tard
rang.remove(p)
rang=rligne[l]
pointban(l,p) #je supprime toutes les cases menacees par cette nouvelle reine de la liste des cases disponible "dispo"
l=l+1 #je passe a la ligne suivante
rang=rligne[(l-1)] #je prends les cases a tester de la nouvelle ligne "l"
print('Rei verif :',Rei)
else:
rang.remove(p) #si (l,p) n'appartient pas a la liste des cases disponible "dispo", je retire "p" de la liste des cases a tester
print('taille fin :',taille)
if len(Rei)==taille: #je regarde si la taille finale de ma liste "Rei" est la meme que la taille initiale ce qui signifie que j'ai tester toutes les cases de la ligne "l" sans succes
rligne[l-1]=point #si c'est le cas, je refixe la liste des cases a tester sur la ligne "l" a : toutes les cases de la ligne
del Rei[-1] #je supprime la derniere reine de la liste "Rei" donc celle de la ligne "l-1"
pointdeban() #je mets a jour les cases disponible dans la liste "dispo" suite a la suppression de cette reines
l=l-1 #je me place a la ligne "l-1"
reine(l) #je recommence l'opération a cette ligne sachant que la case de rang "p" de la reine qui a ete supprimee n'est plus dans la liste des cases a tester
#initialisation
Rei=[]
dispo=[]
point=[]
rligne=[]
n=8
l=1
for i in range(1,n+1): #je cree une liste de chiffres de 1 a n
point.append(i)
for i in range(0,n): #je cree une liste de n liste de chiffres allant de 1 a n, chaque liste de chiffres correspondant a une ligne contenant n cases a tester
rligne.append(point)
for i in point: #je cree simplement la liste initiale des points disponible c'est a dire tous
for j in point:
dispo.append((i,j))
quad=[0.5,0.5,1.5,2.5,3.5,4.5,5.5,6.5,7.5,8.5]
for x in quad: #cree un quadrillage pour echequier
plt.plot([x,x],[0.5,8.5],"k")
for y in quad:
plt.plot([0.5,8.5],[y,y],"k")
for x in point: #dessine un point dans chaque case
for y in point:
plt.plot(x,y,"ok")
#code
reine(l) #execution de la fonction "reine"
plt.show()
Mon probleme est que quand je regarde le contenant de ma liste "rang" a la ligne 72, je me rend compte qu’en avancant dans les lignes de mon echequier, ma liste initiale de cases a tester ne correspond pas a [1,2,3,4,5,6,7,8] comme attendu. Chaque fois que je passe ligne cette liste est plus petite que la précédente
Voila, j’ai fait au mieux pour expliquer mon problème. J’espere que vous saurez m’aider car je galere un peu…
+0
-0