begin process at 2012 02 08 16:40:22
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Jeux

 > JEU DES 8 REINES

JEU DES 8 REINES


 Information sur la source

Note :
Aucune note
Catégorie :Jeux Niveau :Débutant Date de création :11/01/2005 Date de mise à jour :18/01/2005 12:34:47 Vu / téléchargé :6 400 / 11 994

Auteur : barbichette

Ecrire un message privé
Site perso
Commentaire sur cette source (3)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
Bon, à la base, c'est comment placer 8 reines sur un échiquier de tel façon qu'aucune reine n'en mangent d'autres.
En voilà une solution pour un échiquier de côté n avec n reines.

Evidemment, plus c'est gros, plus c'est long...
l'aperçu présente la solution pour 30 reines (environ 3 Min de calcul sur un 2 GHz / 768 Mo Ram)

Le code est archi simple, c'est pour les gens qui ne comprenne pas trop l'utilité de la récursivité



 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

18 janvier 2005 12:34:48 :
Pour la solution avec 8 reines, c'est possible. C'est justement le but du casse tête. Les seules solutions impossibles sont avec 2 et 3 cases de côtés. Les solutions pour 1 et 4 sont d'ailleurs assez facile à trouver sans programme. Pour les bugs. En effet, je m'excuse, je me suis trompé de répertoire et j'ai envoyer une veille version qui ne marchait pas.... Excusez moi encore... Voici la nouvelle version, qui marche... (enfin, chez moi) Et c'est celle qui correspond à la capture que j'avait déposé. sinon, merci nono pour la version dans passer le tableau en param à la fonction Place. J'était tellement attentif aux problêmes de diagonales que j'ai un peu zapper le reste du code... J'ai donc aussi modifier ça dans le code.

 Sources du même auteur

Source avec Zip Source avec une capture COMPARATIF ALGO CERCLES
Source avec Zip Source avec une capture INTERPRETEUR DE LANGAGE PERSONNALISABLE BIS
Source avec Zip Source avec une capture INTERPRETEUR DE LANGAGE PERSONNALISABLE
Source avec Zip Source avec une capture RUBIK'S CUBE
Source avec Zip Source avec une capture SPINEDIT EN DÉCIMAL AVEC GESTION DES UNITÉS

 Sources de la même categorie

Source avec Zip JEU DE MOT MOTUS par philouchess
Source avec Zip Source avec une capture [LAZARUS] JEUX/LABYRINTHE : GENERATION ET RÉSOLUTION par timmalos
Source avec Zip Source avec une capture RUBIK'S CUBE par barbichette
Source avec Zip RUMMIKUB DES CHIFFRES CONTRE ORDINATEUR par Toidil
Source avec Zip Source avec une capture JEU D'ÉCHEC MAZETTE par ADMR

Commentaires et avis

Commentaire de Nono40 le 16/01/2005 03:58:54

Ce qui aurait été cool, c'est de mettre le code qui fonctionne dans le zip...

D'autre part essaye de soigner l'indentation, car c'est très dur à relire ton programme...

Voici la procédure corrigiée pour ceux qui la souhaitent :
function place(h,c:integer):boolean;
var
  i,k:integer;
  ok:boolean;
begin
  result:=false;
  // on place la reine
  d[c]:=h;
  // si on est à la dernière colonne, c'est bon
  If c=n Then
  begin
    result:=true;
    Solution:=True;
    Exit;
  end
  Else
  Begin
    // sinon, on essaie de placer une reine sur la colonne suivante
    For i:=1 To n do
    begin
      ok:=True;
      k:=1;
      While (k<=c)And OK Do
      Begin
        // (il y a forcément personne sur la colonne)
        // y-a-t'il quelqu'un sur la même ligne ?
        if d[k] = i Then ok:=False Else
        // y-a-t'il quelqu'un sur une diagonale ?
        if (c + 1 - k) = (i - d[k]) Then ok:=False Else
        // y-a-t'il quelqu'un sur l'autre diagonale ?
        if (k - c - 1) = (i - d[k]) Then ok:=False;
        // on stop si on a fini le parcour ou si une autre reine est présente
        inc(k);
      End;
      // si c'est ok, on place la reine et on continue
      if ok Then
        if place(i, c + 1) then
        Begin
          Result:=True;
          exit;
        End;
    end;
  End;
end;

Commentaire de Nono40 le 16/01/2005 14:42:33

La déclaration des variables modifiée :
var
   n:integer;
   d:tdam;
   Solution:Boolean;

Et la procédure OnClick ( seul le début est modifié ) :
procedure TForm1.Button1Click(Sender: TObject);
var
i,j:integer;
begin
  n:=spinedit1.Value;
  //on essaye de placer la première reine sur une des cases de la première colonne
  Solution:=False;
  For i:=1 To (n+1) Div 2 Do If PLace(i,1) Then Break;
  If Not Solution Then
  Begin
    ShowMessage('Pas de solution');
    Exit;
  End;

image1.Canvas.Brush.Color:=clwhite;
[...]


Il y a bien une solution pour 8 cases.

Commentaire de barbichette le 01/05/2009 14:09:48

je reviens après 4 ans... pour ajouter un algorithme très rapide et très simple pour trouver une solution à se casse-tête.

Pour plus d'information sur cet algorithme, consultez la page de wikipédia :
http://fr.wikipedia.org/wiki/Huit_dames


procedure TForm1.Button1Click(Sender: TObject);
var
n,i,j:integer;
reste:integer;
place:array of integer;
begin
n:=spinedit1.Value;
if n<4 then exit;
setlength(place,n);
reste:=n mod 12;
case reste of
3,9:
  begin
   for i:=1 to n div 2-1 do place[i-1]:=i*2+2;
   for i:=2 to (n-1) div 2 do place[n div 2+i-2]:=i*2+1;
   place[n div 2-1]:=2;
   place[n-2]:=1;
   place[n-1]:=3;
  end;
2:
  begin
   for i:=0 to n div 2-1 do place[i]:=i*2+2;
   for i:=3 to (n-1) div 2 do place[n div 2+i-1]:=i*2+1;
   place[n div 2+0]:=3;
   place[n div 2+1]:=1;
   place[n-1]:=5;
  end;
8:
  begin
   for i:=0 to n div 2-1 do place[i]:=i*2+2;
   for i:=0 to (n-1) div 2 do
    if i and 1=0 then place[n div 2+i]:=i*2+3
                 else place[n div 2+i]:=i*2-1;
  end;
else
  for i:=0 to n div 2-1 do place[i]:=i*2+2;
  for i:=0 to (n-1) div 2 do place[n div 2+i]:=i*2+1;
end;


image1.Canvas.Brush.Color:=clwhite;
for j:=0 to n-1 do
for i:=0 to n-1 do
  image1.Canvas.Rectangle(image1.Width*i div n,image1.Height*j div n,image1.Width*(i+1) div n,image1.Height*(j+1) div n);

image1.Canvas.Brush.Color:=clred;
for i:=1 to n do
   image1.Canvas.Rectangle(image1.Width*(i-1) div n,image1.Height*(place[i-1]-1) div n,image1.Width*i div n,image1.Height*place[i-1] div n);
end;

 Ajouter un commentaire




Nos sponsors


Appels d'offres

Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,716 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales