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 :

Algorithme logique Solution


Sujet :

Algorithmes et structures de données

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 71
    Par défaut Algorithme logique Solution
    Salut à tous ! Je rencontre un petit problème j'espère pouvoir avoir de l'aide


    Donc voila soit n, la taille d'une grille d'un sudoku. Donc pour une grille à 5 lignes et 5 colonnes,
    n=5 .

    Soit également : i,j,k , la triplette qui donne la valeur d'une cause .
    Par exemple : 2,1,4 signifie qu'à la ligne 2, 1ère colonne, on a la valeur 4.


    Le problème :
    Mon objectif est de transformer la suite de triplette en variable unique, allant de 1 à n².

    Autrement dit ( toujours pour n = 5) :
    1,1,1 => 1
    1,1,2 => 2
    ...
    1,2,5 => 5
    1,2,1 => 6

    Afin d'établir cette relation, j'utilise la fonction suivante :
    n²(i-1) + n(j-1) + k

    Aucun soucis jusque là.
    Le problème que je rencontre est de faire l'inverse, ce qui est apparemment impossible avec une fonction mathématique. Il me faudrait un algo.
    L'objectif est donc par exemple :
    On me donne l'entier "6", je dois retrouver = > 1,2,1.

    C'est casse tête je sais :p , mais si quelqu'un a envie de se casser la tête bin ... merci d'avance !
    Car je suis bloqué depuis plus de 2 jours pour trouver une solution ..

  2. #2
    Membre Expert
    Avatar de Franck Dernoncourt
    Homme Profil pro
    PhD student in AI @ MIT
    Inscrit en
    Avril 2010
    Messages
    894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PhD student in AI @ MIT
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2010
    Messages : 894
    Par défaut
    http://fr.wikipedia.org/wiki/%C3%89q..._ax%2Bby_%3D_c ?

    EDIT : désolé, j'avais lu trop rapidement, mon lien est mauvais car k est également une inconnue. Donc plus généralement, ton équation est de type diophantienne du premier degré (mais pas forcément une identité de Bézout, ce qui ne serait le cas que si k est une constante, i.e. ssi tu n'avais que 2 inconnues)

  3. #3
    Membre Expert
    Avatar de Franck Dernoncourt
    Homme Profil pro
    PhD student in AI @ MIT
    Inscrit en
    Avril 2010
    Messages
    894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PhD student in AI @ MIT
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2010
    Messages : 894
    Par défaut
    Au passage je suppose que tu voulais dire 1,1,5 => 5 ?

    Au-delà du caractère général de mon message précédent, ton problème a des contraintes spécifiques qui font que l'équation me semble facile à résoudre à coup de division et modulo.

    E.g. pour 6 quelque chose du genre :
    k = 6 (mod n) = 1 (si n = 5)
    i = ceiling(6 / n) (mod n) = 2 (si n = 5)
    j = ceiling(6 / n²) (mod n) = 1 (si n = 5)

  4. #4
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 977
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 977
    Par défaut
    Lai,

    Oui, je suis arrivé au même genre de résultat :

    Code C : 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
    uint32_t getIt(uint32_t n, uint32_t i,uint32_t j,uint32_t k)
    {
        // n²(i-1) + n(j-1) + k
        uint32_t res = n*n*(i-1) + n*(j-1) + k;
        return res;
    }
    int main()
    {
        const uint32_t n = 5;
        uint32_t i,j,k,r,modK,rModK,modJ,rModJ,modI;
     
        for (i=1; i<=n; ++i)
        {
            for (j=1; j<=n; ++j)
            {
                for (k=1; k<=n; ++k)
                {
                    r = getIt(n,i,j,k);
                    modK = (r-1) % n; // = k-1 !!!
                    rModK = r - (modK+1);
     
                    modJ = (rModK / n) % n; // = j-1 !!!
                    rModJ = (rModK / n)- modJ;
     
                    modI = rModJ / n; // = i-1  !!!
     
                    printf("%1u%1u%1u => %3u, modK = %1u, rModK = %3u, modJ = %3u, rModJ = %1u, modI = %1u\n",i,j,k,r,modK,rModK,modJ,rModJ,modI);
                }
            }
        }
     
        return 0;
    }
    et en sortie (pas complète, pour éviter trop de lignes)
    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
    111 =>   1, modK = 0, rModK =   0, modJ =   0, rModJ = 0, modI = 0
    112 =>   2, modK = 1, rModK =   0, modJ =   0, rModJ = 0, modI = 0
    113 =>   3, modK = 2, rModK =   0, modJ =   0, rModJ = 0, modI = 0
    114 =>   4, modK = 3, rModK =   0, modJ =   0, rModJ = 0, modI = 0
    115 =>   5, modK = 4, rModK =   0, modJ =   0, rModJ = 0, modI = 0
    121 =>   6, modK = 0, rModK =   5, modJ =   1, rModJ = 0, modI = 0
    122 =>   7, modK = 1, rModK =   5, modJ =   1, rModJ = 0, modI = 0
    123 =>   8, modK = 2, rModK =   5, modJ =   1, rModJ = 0, modI = 0
    124 =>   9, modK = 3, rModK =   5, modJ =   1, rModJ = 0, modI = 0
    125 =>  10, modK = 4, rModK =   5, modJ =   1, rModJ = 0, modI = 0
    131 =>  11, modK = 0, rModK =  10, modJ =   2, rModJ = 0, modI = 0
    132 =>  12, modK = 1, rModK =  10, modJ =   2, rModJ = 0, modI = 0
    133 =>  13, modK = 2, rModK =  10, modJ =   2, rModJ = 0, modI = 0
    134 =>  14, modK = 3, rModK =  10, modJ =   2, rModJ = 0, modI = 0
    135 =>  15, modK = 4, rModK =  10, modJ =   2, rModJ = 0, modI = 0
    141 =>  16, modK = 0, rModK =  15, modJ =   3, rModJ = 0, modI = 0
    142 =>  17, modK = 1, rModK =  15, modJ =   3, rModJ = 0, modI = 0
    143 =>  18, modK = 2, rModK =  15, modJ =   3, rModJ = 0, modI = 0
    144 =>  19, modK = 3, rModK =  15, modJ =   3, rModJ = 0, modI = 0
    145 =>  20, modK = 4, rModK =  15, modJ =   3, rModJ = 0, modI = 0
    151 =>  21, modK = 0, rModK =  20, modJ =   4, rModJ = 0, modI = 0
    ...
    532 => 112, modK = 1, rModK = 110, modJ =   2, rModJ = 20, modI = 4
    533 => 113, modK = 2, rModK = 110, modJ =   2, rModJ = 20, modI = 4
    534 => 114, modK = 3, rModK = 110, modJ =   2, rModJ = 20, modI = 4
    535 => 115, modK = 4, rModK = 110, modJ =   2, rModJ = 20, modI = 4
    541 => 116, modK = 0, rModK = 115, modJ =   3, rModJ = 20, modI = 4
    542 => 117, modK = 1, rModK = 115, modJ =   3, rModJ = 20, modI = 4
    543 => 118, modK = 2, rModK = 115, modJ =   3, rModJ = 20, modI = 4
    544 => 119, modK = 3, rModK = 115, modJ =   3, rModJ = 20, modI = 4
    545 => 120, modK = 4, rModK = 115, modJ =   3, rModJ = 20, modI = 4
    551 => 121, modK = 0, rModK = 120, modJ =   4, rModJ = 20, modI = 4
    552 => 122, modK = 1, rModK = 120, modJ =   4, rModJ = 20, modI = 4
    553 => 123, modK = 2, rModK = 120, modJ =   4, rModJ = 20, modI = 4
    554 => 124, modK = 3, rModK = 120, modJ =   4, rModJ = 20, modI = 4
    555 => 125, modK = 4, rModK = 120, modJ =   4, rModJ = 20, modI = 4

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 71
    Par défaut
    Franck Dernoncourt, j'ai l'impression que cela ne marche pas.
    Par exemple pour 37

    Pour n = 5
    On a k = 37 % 5 = 1 ( ok )
    on a i = (37/5)% 5 = 2 ( ok )
    Mais on a :
    j = (37/5²) % 5 = 1 alors qu'il devrait être égale à 3 :/

  6. #6
    Membre Expert
    Avatar de Franck Dernoncourt
    Homme Profil pro
    PhD student in AI @ MIT
    Inscrit en
    Avril 2010
    Messages
    894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PhD student in AI @ MIT
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2010
    Messages : 894
    Par défaut
    Ah peut-être, je n'ai lu que très rapidement ton message et n'ai pas regardé les détails, je voulais simplement te donner une idée d'algorithme pour trouver les variables i,j et k. Je te laisse faire la fin

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 71
    Par défaut
    Bin sincérement j'y travail depuis 2 jours j'y arrive pas ..
    Pour le i et le k apparemment c'est bon mais le j ..

  8. #8
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 977
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 977
    Par défaut
    Xia,
    Citation Envoyé par Adel13 Voir le message
    Bin sincérement j'y travail depuis 2 jours j'y arrive pas ..
    Pour le i et le k apparemment c'est bon mais le j ..
    Il se pourrait que lire mon message précédent t'aide !

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 71
    Par défaut
    Oui dsl merci de ta réponse, j'ai vraiment eu du mal à la comprendre pourrais-tu me l'expliquer un peu ?
    Quel sont toutes ces variables ?
    Vraiment désolé ..

  10. #10
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 977
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 977
    Par défaut
    Vie,

    J'ose espérer que tu plaisantes !!

    n,i,j,k sont les mêmes que les tiens, les autres sont des calculs intermédiaires et/ou définitifs, et dans le code, il y a de petits commentaires pour dire leur finalité (enfin, les 3 qui comptent, celles qui contiennent ce que tu cherches).

    Regarde la liste de sortie pour t'en convaincre.

  11. #11
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par droggo Voir le message
    J'ose espérer que tu plaisantes !!
    Optimiste !!

Discussions similaires

  1. Exércices des algorithmes avec solutions
    Par istam dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 15/12/2008, 22h30
  2. Un algorithme de solution optimal
    Par Invité2 dans le forum Intelligence artificielle
    Réponses: 6
    Dernier message: 26/08/2008, 15h52
  3. aide pour trouver la solution pour quelques algorithmes
    Par abdoue2004 dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 24/01/2007, 15h57
  4. Algorithme quand tu nous tiens : conditions logiques
    Par v4np13 dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 21/12/2006, 20h31
  5. Opérateurs logiques: solution plus simple?
    Par p0Kep0K dans le forum Langage SQL
    Réponses: 4
    Dernier message: 27/04/2006, 16h48

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