IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

problème des N reines récursif


Sujet :

C++

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Août 2003
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2003
    Messages : 9
    Par défaut problème des N reines récursif
    Bonjour
    Voici le code utilisé pour trouver de manière récursive les N reines. (backtrack simple)
    Ce code est très compact mais seul petit hic c que à l'exécution il semble plus lent que certains programme tout fait que j'ai trouve itératif.
    Alors je me demandais s'il était possible de doper le programme récursif si oui de quelles manières ?
    Existe t il une option dans le compilateur (j'utilise visual studio dot net 2003) pour qu'il transforme a la compilation la partie récursive en itératif ou du moins améliorer la vitesse du récursif ?
    merci d'avance
    voici le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
     
    #include <iostream>
    #include <cmath>
    using namespace std;
     
    void affichage(int *echequier,int N){
     
    	for(int i=0;i<N;i++){
     
            cout<<echequier[i];	
     
    	}
    	cout<<endl;
    }
    inline bool solution(int *echequier, int &nombre_solution,int i_max,int N){ //inline accélère
     
    	for(int i=0;i<i_max-1;i++){
     
    		for(int j=i+1;j<i_max;j++){
     
    			if((std::abs(echequier[i]-echequier[j])==std::abs(i-j))||(echequier[i]==echequier[j])){
     
    				return false;
    			}		
    		}	
    	}
    	if(i_max==N){
    		nombre_solution++;
     
    	}	// si va jusqu'au bout de la boucle c'est que les dames se prennent pas en diagonale)
     
    	return true;
    }
     
    void generer(int *echequier,int etat_avancement,int N,int &nombre_solution){
     
    	if(etat_avancement==N){	
    		for(int i=1;i<=N;i++){
     
    			echequier[etat_avancement-1]=i;
    			solution(echequier,nombre_solution,N,N);				
     
    		}	
    	}
    	else{
    		for(int i=1;i<=N;i++){
     
    			echequier[etat_avancement-1]=i;
    			if(solution(echequier,nombre_solution,etat_avancement,N)==false){
     
    				continue;
     
    			}
     
    			generer(echequier,etat_avancement+1,N,nombre_solution);
     
     
    		}
    	}
    }
    void main(){
     
    	int *echequier;
    	while(1){
    		int Nombre_reines,compteur=0;
    		do{
    			cout<<"Entrez le nombre de reines voulues"<<endl;
    			cin>>Nombre_reines;
     
    		}while(Nombre_reines<1);
    		echequier=new int[Nombre_reines];
     
    		generer(echequier,1,Nombre_reines,compteur);
    		cout<<compteur<<endl;
    	}
     
    }

  2. #2
    Membre émérite Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Par défaut
    J'avoue que c'est bizarre, normalement t'es en situation de récursivité terminale, le compilateur doit savoir supprimer dérécursifier ça...

    T'es sûr que l'algorithme est exactement le même ?

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Août 2003
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2003
    Messages : 9
    Par défaut
    oui mais il faut choisir une option dans le compilateur pour qu'il le fasse je suppose ?? mais je ne sais pas laquelle ?

  4. #4
    Membre émérite Avatar de reggae
    Profil pro
    Inscrit en
    Août 2005
    Messages
    773
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2005
    Messages : 773
    Par défaut
    Je viens de m'en rendre compte, mais pour que ton algo soit vraiment écrit en C++, la fonction principale: main() doit retourner un entier(int).

  5. #5
    Membre éprouvé
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Décembre 2005
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Décembre 2005
    Messages : 109
    Par défaut
    Pour les optimisations, il suffit de chercher dans les propriétés du projet sous Visual (du moins sous la version 2005 -_-).
    J'ai essayé avec mingw/g++ : gain allant jusqu'à 50% de temps en moins avec l'optimisation (-O2).

    En passant : il y a un delete[] qui va avec ceci ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echequier=new int[Nombre_reines];

  6. #6
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Citation Envoyé par reggae
    Je viens de m'en rendre compte, mais pour que ton algo soit vraiment écrit en C++, la fonction principale: main() doit retourner un entier(int).
    main retourne 0 par défaut, il me semble...

  7. #7
    Membre éprouvé
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Décembre 2005
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Décembre 2005
    Messages : 109
    Par défaut
    Citation Envoyé par Alp
    Citation Envoyé par reggae
    Je viens de m'en rendre compte, mais pour que ton algo soit vraiment écrit en C++, la fonction principale: main() doit retourner un entier(int).
    main retourne 0 par défaut, il me semble...
    Je pense qu'il parlat de cette ligne là :

  8. #8
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Ah en effet, j'avais cru voir int main, je ne sais pourquoi
    Et puis, pour l'auteur :
    tu mets using namespace std mais après tu utilises std::abs au lieu de abs tout court etc ... Bizarre ^^

Discussions similaires

  1. Probléme des N-reines.
    Par Masshat dans le forum Prolog
    Réponses: 3
    Dernier message: 04/02/2013, 21h09
  2. Problème des n-reines
    Par Myrne dans le forum MATLAB
    Réponses: 7
    Dernier message: 22/03/2011, 15h17
  3. Afficher toutes les solutions au problème des N-Reines
    Par pottiez dans le forum Télécharger
    Réponses: 0
    Dernier message: 30/11/2010, 15h38
  4. solution non récursive au problème des N reines
    Par patrick974 dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 12/09/2008, 15h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo