Partage
  • Partager sur Facebook
  • Partager sur Twitter

Résolveur de SuDoKu

Comment procéder ?

    14 mai 2006 à 19:09:35

    Salut ! :)

    J'ai repris la programmation il n'y a pas lomptemps grâce aux magnifiques explications de bluestorm sur les pointeurs. ;)

    Et je me suis dis que j'allais creer un resolveur de SuDoKu.

    Donc je cherche une méthode pour le resolver.

    Qqn pourrait m'expliquer ?

    ++
    W!nn!3
    • Partager sur Facebook
    • Partager sur Twitter
      14 mai 2006 à 19:11:26

      tu passes sur toutes les cases, et pour chaque case tu regarde s'il n'ya qu'un nombre possible. Si il n'ya qu'un nombre possible tu recommences du debut et ainsi de usite. S'il n'y a aucun nombre possible, tu passes a la case suivantes. A mon avis boleen + tableau a 2 dimensions feront bon menage
      • Partager sur Facebook
      • Partager sur Twitter
        14 mai 2006 à 19:11:33

        tu regarde la méthode que TOI tu fais, tu la converti en algoritme, et tu code...
        • Partager sur Facebook
        • Partager sur Twitter
          14 mai 2006 à 19:12:49

          Ca fait 2 jours que je cherche, je ne vois toujours pas comment referencer les cases, les lignes et les colonnes et les regions !

          Variables ? Ca en fait beaucoup !
          • Partager sur Facebook
          • Partager sur Twitter
            14 mai 2006 à 19:24:52

            hum tableau a 2 dimensions

            apres pour les lignes et les colonnes c'est facile (tu fais tous les cases [i][ta colonne] et [ta ligne] [j]

            pour les regions je pense a un modulo, tu regardes dans quelle region tu te trouve avec les mdulos (plutot des diviusons sans reste pltuot), et apres une petite boucle (qui si tu t'arrange bien sera la meme tout le temps avec des multipliactaions) et c'est bon
            • Partager sur Facebook
            • Partager sur Twitter
              14 mai 2006 à 19:25:25

              Citation : W!nn!3

              Variables ? Ca en fait beaucoup !



              Erf... ton ordi a de la place...

              Et pis zut ça sert à quoi un résolveur de sudoku ? o_O Le but c'est bien de se remuer les méninges non ? ;)
              • Partager sur Facebook
              • Partager sur Twitter
                14 mai 2006 à 19:27:28

                Citation : Piclem

                Et pis zut ça sert à quoi un résolveur de sudoku ? o_O Le but c'est bien de se remuer les méninges non ?



                Ouais mais faire un résolveur de sudoku ça remue encore plus les méninges ;)
                • Partager sur Facebook
                • Partager sur Twitter
                  14 mai 2006 à 19:27:38

                  /*Rempli directement la grille donnée en argument*/
                  int resolve(int grille[RG][RG])
                  {
                    int grille_init[RG][RG];
                    int i = 0;
                    int j = 0;
                    int first_i;
                    int first_j;
                     
                    copier_tableau(grille,RG,grille_init);
                    /*on cherche la première case vide*/
                    while (grille_init[i][j] != 0)
                      {
                        if (j == 8) /*si on arrive à la dernière colonne....*/
                          {
                            j = 0;
                            i++; /*...on passe à la ligne suivante*/
                          }
                        else
                          j++;
                      }
                    first_i=i;
                    first_j=j;

                    /*on ne s'arrete pas tant que toutes les cases ne sont pas remplies*/
                    while (i < RG)
                      {
                        while ( test(grille,i,j)==0)/*on incrémente la valeur de la case tant qu'une valeur ne vérifie pas le test*/
                          grille[i][j]++;
                                
                        grille[i][j]++;/*on incrémente la valeur car dans le test, on teste pour la valeur au dessus*/
                              
                        /*CAS OU LA GRILLE EST IRRESOLVABLE*/
                        if(i == first_i && j == first_j && grille[i][j]==10) /*si on est à la première case vide et qu'aucunes valeurs ne convient*/
                          {                                                  /*alors la grille est irrésolvable*/
                            return 1;
                          }

                     
                        if (grille[i][j] == 10)/*cas où aucune valeur n'est possible*/
                          {
                            grille[i][j] = 0;/*on remet à 0 la case qui a atteint le max = 10*/
                            if (j == 0)/*on revient à la case précedente*/
                              {
                                j = 8;
                                i--;
                              }
                            else
                              j--;
                            
                            while (grille_init[i][j] != 0)/*on recule tant que l'on tombe sur une case contenant un chiffre fixe*/
                              {
                                if (j == 0)
                                  {
                                    j = 8;
                                    i--;
                                  }
                                else
                                  j--;
                              }
                            
                          }
                        else if (j == 8)/*si la valeur est < 10, on continue en passant à la case suivante*/
                          {
                            j = 0;
                            i++;
                          }
                        else
                          j++;
                       
                        while (grille_init[i][j] != 0) /*on cherche la prochaine case vide */
                          {
                            if (j == 8)
                              {
                                j = 0;
                                i++;
                              }
                            else
                              j++;
                          }
                      }
                     return 0;
                  }

                  /*Teste si la valeur de la case est valable */
                  int test(int grille_test[RG][RG], int a, int b)
                  {
                    int result = 1;/*1 => valable, 0 => impossible */
                    int valeur = grille_test[a][b]+1;
                    int k;
                    int l;
                    int m;

                    /*coordonnées des carrés de coté 3 */
                    int carre_x = a/3;
                    int carre_y = b/3;

                    for (k = 0; k < 9; k++)
                      if(grille_test[a][k] == valeur || grille_test[k][b] == valeur)
                        result=0;/*alors la valeur testee est deja sur la ligne ou la colonne*/
                     
                    if(result == 1)/*evite de faire le test ci dessous si on a deja prouver que la valeur n'était pas possible a placer*/
                      {
                        for (l = 0; l < 3; l++)
                          for (m = 0; m < 3; m++)
                            if(grille_test[carre_x * 3 + l][carre_y * 3 + m] == valeur)
                              result = 0;/*alors la valeur testee est deja dans la region*/
                      }
                    return result;
                  }

                  void copier_tableau(int original[RG][RG], int rang,int copie[RG][RG])/*fait une copie du tableau passé en argument*/
                  {
                    int c;
                    int d;

                    for (c = 0; c < rang; c++)
                      for (d = 0; d < rang; d++)
                        copie[c][d] = original[c][d];
                  }
                  • Partager sur Facebook
                  • Partager sur Twitter

                  Résolveur de SuDoKu

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown