Placer 8 reines sur un echiquier

Description

Ce petit programme permet de placer, comme son titre l'indique huit dames sur un echiquier de 8*8 cases sans qu'aucune ne puissent se prendre.
Pour ceux qui ne connaissent pas les echecs, une dame peut prendre les pieces qui se trouvent sur la meme ligne, colonne ou diagonale.
Il peut egalement evoluer vers un nombre de cases plus ou moins importantes. Il suffit de remplacer les 8 en ce que l'on veut (il n'y a que 5 huit).
Ce programme montre comment une fonction recursive peut remplacer des boucles imbriquees.
Le fichier zip contient le meme code mais avec des commentaires detailles.

Source / Exemple :


#include <stdio.h>
#include <iostream.h>
       /*           Remember smoking is bad for health                    */

/*Ce programme est concu pour huit reines mais il peut egalement evoluer tres rapidement vers un plus grand
nombre de reines sur un plus grand echiquier.

  • /
int nbcase=8; int point[8][8]; //tableau representant l'echiquier int x,y; //variables pour les boucles de l'affichage du tableau int c[8]; //tableau qui contient le numero de ligne des dames int d ; // variable pour les entrees-sorties int e[8]; //tableau qui contient les valeurs de demarrage des boucles int dame(int a,int b,int num); //fonction pour placer ou retirer une dame int afftable(); //fonction qui affiche les resultats int placedame(int ligne){ //fonction pour essayer les positions possibles for (c[ligne]=e[ligne];c[ligne]<nbcase;c[ligne]++){ if (point[c[ligne]][ligne]==0){ e[ligne]=c[ligne]+1; dame(ligne,c[ligne],2); if (ligne<nbcase -1){ placedame(ligne+1); } if (ligne==nbcase -1){ afftable(); dame(ligne,c[ligne],-2); dame(ligne-1,c[ligne-1],-2); placedame(ligne-1); } break ; } } if (ligne !=0){ if (c[ligne]>=nbcase){ for (x=ligne;x<nbcase;x++){ e[x]=0; } dame(ligne-1,c[ligne-1],-2); //on efface la dame de la colonne juste avant placedame(ligne-1); //on essaye de placer la dame sur la colonne d'avant } } } int dame(int a,int b,int num){ for (x=0;x<nbcase;x++){ if (x !=a){ point[b][x]+=num; //trace les lignes horizontales et verticales occupees } if (x !=b){ point[x][a]+=num; } } for (x=1;x<nbcase;x++){ // trace les lignes diagonales occupees if (a+x<nbcase && b+x<nbcase){ point[b+x][a+x]+=num; } if (a-x>=0 && b-x>=0){ point[b-x][a-x]+=num; } if (a-x>=0 && b+x<nbcase){ point[b+x][a-x]+=num; } if (a+x<nbcase && b+x>=0){ point[b-x][a+x]+=num; } } if (num>0){ point[b][a]+=1; //place la dame } if (num<0){ point[b][a]-=1; //retire la dame } } int afftable(){ for (x=0;x<nbcase;x++){ for (y=0;y<nbcase;y++){ if (point[x][y] !=1){ cout<<0<<" "; } if (point[x][y]== 1){ cout<<point[x][y]<<" "; } } cout<<endl; } cout<<endl; cout<<"entier = une etape ,lettre=toutes les etapes"<<endl; cin>>x; } int main(int argc, char *argv[]) { for (x=0;x<nbcase;x++){ //initialise le tableau avec des 0 e[x]=0; for (y=0;y<nbcase;y++){ point[x][y]=0; } } cout<<"Ce programme place "<<nbcase<<" dames sur un echiquier sans qu'elles puissent se prendre."<<endl; cout<<"choisissez la ligne ou doit se trouver la premiere dame : (entre 1 et "<<nbcase<<")"<<endl; cin>>d; d--; cout<<endl; if (d<0 || d>nbcase -1){ d=0; } e[0]=d; placedame(0); //essaye de placer les dames afftable(); cin>>x; //permet a l'utilisateur de voir la reponse return 0; } /* Programme realise par Gandalf Darkblue le 2 juin 2003 */

Conclusion :


bugs : probleme pour quitter (il faut cliquer sur la croix)
necessite des modifications pour visual c++

Programme avec Dev c++

Codes Sources

A voir également

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.