Introduction à l'algorithmique 15 - Les 8 reines

Hello! Nous voici déjà arrivé au 15<sup>ème</sup> article sur l'algorithmique! Je vous propose de fêter ça avec un problème vraiment très populaire: Les 8 reines.

L'une des raisons de sa popularité est du fait qu'il est souvent utilisé en cours d'informatique pour introduire la récursivité... Ne croyez pas que ce problème soit simple pour autant! Surtout si la notion de récursivité est encore un peu vague pour vous.

Bon, rentrons dans le vif du sujet: les 8 reines. Le but de ce problème est de réussir à placer 8 reines d'un jeu d'échecs sur un échiquier classique (8x8 cases) sans que celles-ci ne puissent se menacer.

Pour ceux qui ne connaissent pas les règles des échecs: Chaque pièce se déplace d'une manière différente. La reine peut se déplacer du nombre de cases qu'elle désirs sur une rangée, colonne ou diagonale.

Mouvement Reine

Exemple de solution: Solution

J'ai trouvé sur le net un petit programme fait en JAVA qui permet de vraiment bien comprendre le déroulement de l'algorithme:

<a title="8 reines" href="http://wwwdi.supelec.fr/fb/downloads/FISDA/HuitReines.jar" target="_blank"> http://wwwdi.supelec.fr/fb/downloads/FISDA/HuitReines.jar </a>

En bref: La fonction récursive empile les bons résultats au fur et à mesure qu'une reine supplémentaire peut être placée, a la première erreur, l'algorithme dépile le résultat de la fonction.

On appelle ce type d'algorithme "programmation par contrainte"

Bon, on s'y met?

Pseudo-code de la fonction principale:

DéBUT
  lignes <- [0, 0, 0, 0, 0, 0, 0, 0]
  HUIT_REINES(lignes, 1)
FIN

Pseudo-code de la fonction HUIT_REINES

ENTRER lignes, y
  POUR x <- 1 JUSQU'à COMPTER(lignes) FAIRE
    SI PEUT_POSER(lignes, x, y) = 1 ALORS
      lignes[y] <- x
      SI y = 7 ALORS
        AFFICHER_ECHIQUIER(lignes)
      SINON
        HUIT_REINES(lignes, y + 1)
      FINSI
    FINSI
  FINPOUR
RETOURNER

Pseudo-code de la fonction PEUT_POSER

ENTRER lignes, x, y
  boucler <- 1
  i <- 1
  ret <- 1
  TANTQUE i < y ET boucler = 1 FAIRE
    SI lignes[y-i] = x OU lignes[y-i] = x-i OU lignes[y-i] = x+i ALORS
      boucler <- 0
      ret <- 0
    FINSI
    i <- i + 1
  FINTANTQUE
RETOURNER ret

Pseudo-code de la fonction AFFICHER_ECHIQUIER

ENTRER lignes
  output <- ""
  ECRIRE "Une solution possible:"
  ECRIRE "-------------------------"
  POUR y <- 1 JUSQU'à 8 FAIRE
    POUR x <- 1 JUSQU'à 8 FAIRE
      SI x = lignes[y] ALORS
        output <- output + "| Q"
      SINON
        output <- output + "| "
      FINSI
    FINPOUR
    output <- output + "|"
    ECRIRE output
    ECRIRE "-------------------------"
    output <- ""
  FINPOUR
RETOURNER

Voici qui conclu en beauté cette série d'introduction à l'algorithmique ! J'espère que celle-ci vous aura donné envie d'approfondir plus vos connaissances dans ce domaine !

Tags

  • algorithmique

Cet article à été posté le