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

Algorithmes et structures de données Discussion :

[Howto] étoile magique


Sujet :

Algorithmes et structures de données

  1. #21
    Membre Expert
    Avatar de SpiceGuid
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 704
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 704
    Par défaut
    Citation Envoyé par Trap D
    Je ne fais afficher que la première réponse.
    Ça tombe bien il n'y a qu'une seule réponse pour N=5

    Je trouve ça formidable que tu puisse prototyper aussi vite une solution en Prolog

    Mon conseil pour améliorer ta solution: au lieu de permuter tous les nombres dans la pyramide tu peux ne tester que les arrangements sur la ligne de base.
    C'est-à-dire que tu testes les arrangements de N entiers parmi N×(N+1)/2.
    La partie supérieure de la pyramide ne sert plus qu'à valider l'arrangement sur la ligne de base.
    Pour N=5 la seule ligne de base valide est 13 3 15 14 6 (ou bien son symétrique).

    Atout supplémentaire: une fois que tu as réalisé cette optimisation il devient possible d'accroître la taille de la pyramide (chercher parmi plus de N×(N+1)/2 entiers) sans beaucoup modifier ton code.

  2. #22
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Citation Envoyé par SpiceGuid Voir le message
    Ça tombe bien il n'y a qu'une seule réponse pour N=5
    Par contre pour l'étoile magique (n=6) il y en a 960 !
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  3. #23
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Citation Envoyé par SpiceGuid Voir le message
    Ça tombe bien il n'y a qu'une seule réponse pour N=5
    Non il y en a 2 ... mais elle sont symétriques

    Citation Envoyé par SpiceGuid Voir le message
    Mon conseil pour améliorer ta solution: au lieu de permuter tous les nombres dans la pyramide tu peux ne tester que les arrangements sur la ligne de base.
    C'est-à-dire que tu testes les arrangements de N entiers parmi N×(N+1)/2.
    La partie supérieure de la pyramide ne sert plus qu'à valider l'arrangement sur la ligne de base.
    Pour N=5 la seule ligne de base valide est 13 3 15 14 6 (ou bien son symétrique).

    Atout supplémentaire: une fois que tu as réalisé cette optimisation il devient possible d'accroître la taille de la pyramide (chercher parmi plus de N×(N+1)/2 entiers) sans beaucoup modifier ton code.
    Pas forcément facile à coder avec des contraintes, je vais y réfléchir
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  4. #24
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Et pour ceux que ça intéresse, mon code Java pour trouver les solutions des étoiles magiques pour N quelconque.

    Code java : 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
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    int N = 6;
     
    int magicnumber = 4*N+2;
    int nmElements = 2*N;
    int[] elements = new int[nmElements];
    boolean[] used = new boolean[nmElements+1];
     
    // assigne une valeur d'un element
    void setElement(int index, int value) {
    	elements[index]=value;
    	if (value!=0) used[value]=true;
    }
     
    // supprime la valeur d'un element
    void unsetElement(int index) {
    	int value = elements[index];
    	if (value!=0) used[value]=false;
    	setElement(index,0);
    }
     
    // Test si la somme sur un segment est correcte
    boolean isEdgeCorrect(int edgenumber) {
    	// index des 4 elements alignés
    	int n1 = 2*edgenumber;
    	int n2 = (n1+1) % nmElements;
    	int n3 = (n1+3) % nmElements;
    	int n4 = (n1+4) % nmElements;
     
    	// teste si la somme excede le magicnumber
    	int sum = elements[n1]+elements[n2]+elements[n3]+elements[n4];
    	if (sum>magicnumber) return false;
     
    	// teste si le segment est rempli ET que la somme est égale au magicnumber
    	boolean full=(elements[n1]>0) && (elements[n2]>0) && (elements[n3]>0) && (elements[n4]>0);
    	if (full && sum!=magicnumber)  return false;
     
    	return true;
    }
     
    // Test si la figure est correcte
    boolean isStarCorrect() {
     
    	// test la somme de chaque segment
    	for(int i=0;i<N;i++)
    		if (!isEdgeCorrect(i)) return false;
     
    	return true;
    }
     
    /*** LA METHODE A APPELER POUR CALCULER LES SOLUTIONS ***/
    void solve() {
    	int solcount=0;
     
    	// pour chaque element formant l'étoile
    	int index=0;
    	while(index>=0) {
     
     
    		// valeur actuelle
    		int value = elements[index];
     
    		// retire la valeur
    		unsetElement(index);
     
    		// trouve la premiere valeur supérieur qui n'est pas utilisée
    		value++;
    		while(value<=nmElements && used[value]) value++;
     
    		if (value>nmElements) {
    			// pas de valeur trouvée : retour arrière de l'index
    			index--;
    			continue;
    		}
     
    		// assigne la valeur
    		setElement(index, value);
     
    		// le choix ne donne pas une figure correcte 
    		if (!isStarCorrect()) {
    			// on va a nouveau modifier l'element courant
    			continue;
    		}
     
    		// sinon, c'est que la figure actuelle est correcte: on avance l'index
    		index++;
     
    		// la figure est remplie : on a une solution au probleme
    		if (index >= nmElements) {
    			// on affiche la solution
    			System.out.println(Arrays.toString(elements));
    			solcount++;
     
    			// on force un retour arrière pour trouver les autres solutions
    			index--;
    		}					
     
    	}
     
    	System.out.println("Nb de solution(s):"+solcount);
    }

    Pour N=6 -> 960 solutions en 0.250 s
    Pour N=7 -> 1008 solutions en 1.6 s
    Pour N=8 -> 1792 solutions en 14.25 s

    (et oui, la complexité est exponentielle )
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

Discussions similaires

  1. Réponses: 2
    Dernier message: 12/08/2005, 22h15
  2. Probleme avec l'étoile "*"
    Par Tijee dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 10/05/2005, 10h08
  3. Recherche "étoilée" avec std::set
    Par guejo dans le forum MFC
    Réponses: 2
    Dernier message: 06/05/2004, 13h28
  4. [langage] Expression regulière magique?
    Par ma2th dans le forum Langage
    Réponses: 5
    Dernier message: 23/04/2004, 08h19
  5. Howto - Envoi message sur réseau
    Par Thomad dans le forum Windows
    Réponses: 2
    Dernier message: 31/03/2004, 16h46

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