Résolution du problème des 8 dames

Soyez le premier à donner votre avis sur cette source.

Vue 20 285 fois - Téléchargée 2 214 fois

Description

Le problème des 8 dames est un bon prétexte pour présenter le principe des algorithmes récursifs ;)

Pour ceux qui ne connaissent pas, le problème est de trouver toutes les solutions différentes de facon à mettre 8 dames sur un jeu d'échequier sans qu'aucune ne puisse se prendre entre elles.

Le principe est le suivant: on appelle une fonction qui place une dame dans chacune des positions libres de la ligne 0, qui s'appelle elle même en se positionnant sur la ligne suivante... jusqu'à ce qu'il n'y ai plus de place libre ou qu'on arrive à la dernière ligne.

Compilation réalisée sous dev-cpp.

Source / Exemple :


#include <conio.h>
#include <stdio.h>

int posDames[8]={0}; // index du tableau=y, valeur=x
int solution=0;

int abs(int n)
{
    return n<0 ? -n : n;
}

void recursive(int nDames) // nDames=ligne en cours et dames restantes
{
    if(nDames==8)
    {
                 for(int i=0; i<8; ++i)
                 {
                 for(int j=0; j<8; ++j)
                 if(j==posDames[i]) printf("1 ");
                 else printf("0 ");
                 printf("\n");
                 }
                 printf("\n\n");
                 ++solution;
                 }
    for(int i=0; i<8; ++i)
    {
    for(int j=0; j<nDames; ++j)
    if(posDames[j]==i || ( abs(posDames[j]-i) == abs(j-nDames)))
    // Si il y a déjà une dame dans la colonne OU 
    // Si il faut se "déplacer" d'autant (en valeur absolue) de cases en x et y pour aller d'une dame 
    // à une autre c'est à dire que les pieces peuvent se prendre en diagonale
    goto next;
    posDames[nDames]=i;
    recursive (nDames+1); // On parcourt la ligne suivante dans l'echequier
    next: continue;
    }
    return;
}
         
    
int main(int argc, char *argv[])
{
        recursive(0);
        printf("\nNombre de solutions: %d\n",solution);
        _getch();
        return 0;
}

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

pour quoi vous utiliser goto !!!!!
Messages postés
1
Date d'inscription
samedi 23 avril 2011
Statut
Membre
Dernière intervention
23 avril 2011

Svp j'ai besoin de plus d'explication concernant le code source et Merci .
Messages postés
1
Date d'inscription
vendredi 4 avril 2008
Statut
Membre
Dernière intervention
8 avril 2008

Explique moi stp cette ligne, je n'ai rien compris, et je dois savoir le plus vite possible merci bcp pour votre aide

if(posDames[j]==i || ( abs(posDames[j]-i) == abs(j-nDames)))
Messages postés
2
Date d'inscription
jeudi 20 septembre 2007
Statut
Membre
Dernière intervention
27 février 2008

Bonjour, si cela intéresse quelqu'un j'ai écrit un algorithme qui trouve une solution pour n=100 en une dizaine de seconde. L'algorithme n'utilise pas la méthode décrite dans wikipedia :
Il existe un algorithme simple retournant une solution simple pour n dames si n 1 ou n 4:

Diviser n par 12. Se rappeler du reste (c'est 8 pour le problème des huit dames).
Écrire dans l'ordre la liste des nombres pairs de 2 à n.
Si le reste est 3 ou 9, mettre 2 à la fin de la liste.
Écrire dans l'ordre les nombres impairs de 1 à n, mais, si le reste est 8, permuter les deux à deux (ie 3, 1, 7, 5, 11, 9, …).
Si le reste est 2, permuter les places de 1 et 3, puis mettre 5 à la fin de la liste.
Si le reste est 3 ou 9, mettre 1 et 3 à la fin de la liste.
Placer la reine de la première colonne dans la ligne avec le premier nombre de la liste, placer la reine de la seconde colonne dans la ligne avec le deuxième nombre de la liste, etc.

car cet algorithme est trop simple et suppose que l'on connaisse la solution avant d'écrire l'algorithme
De plus il ne fonctionne pas si l'on change légèrement les règles échiquéenne ...
Messages postés
4
Date d'inscription
dimanche 24 décembre 2006
Statut
Membre
Dernière intervention
14 janvier 2007

Merci pour ton commentaire :)
J'utilise dev-c++, et aparament j'ai mis toutes les options susceptibles de diminuer la taille...
J'ai essayé de viré l'en tête iostream pour mettre stdio.h et la comme par magie mon exe passe de 260 ko à... 5,5ko!
C'est pas très normal ça, si? ^^

Sinon pour le system tu as raison faut vraiment que je perde l'habitude de l'utiliser lol
Afficher les 6 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.