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 :

[sudoku] problème d'optimisation


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 34
    Points : 17
    Points
    17
    Par défaut [sudoku] problème d'optimisation
    Bonjours,

    Alors voilà je suis toujours avec mon sudoku, pour l'instant je travail sur un fonction me permettant d'avoir un grille rempli vérifiant les règles du sudoku.

    Donc je créer un tableau 9*9.
    A chaque boucle je remplie la case suivante d'un nombre aléatoire et je vérifie si la grille est bonne avec un testLigne testColonne et testBloc sur la case que je viens d'écrire, si il y a un problème je met une autre valeur déterminée aléatoirement. Dès que les trois tests sont bon je passe à la case suivante.
    Mais a chaque fois que j'exécute le code, il bloque sur une case, jamais la même en plus. Quand je regarde la grille je ne vois aucun problème.

    Voici le .c avec le main

    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
    #include <stdlib.h>
    #include <stdio.h>
    #include "struct.h"
    #include "sudoku.h"
     
     
    int main(int argc,char* argv[])
    {
      sudoku S=creer();
      int i,j;
     
      for(i=0;i<9;i++)
        {
          for(j=0;j<9;j++)
    	{
    	  do
    	    {
    	    faireCase(S,i,j);
    	    printf("i:%d j:%d testcase:%d\n",i,j,testCase(S,i,j));
    	    }
    	  while(!(testCase(S,i,j)));
    	  sauver(S,"essai.sdk");
     
    	}
     
        }
      affiche(S);
      return 1;
     
    }
    Voici le fichier sudoku.c dans lequel sont les fonctions tests.

    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
     
    int testCase(sudoku S,int ligne, int colonne)
    {
     
      return (testLigne(S,ligne) && testColonne(S,colonne) && testBloc(S,quelbloc(ligne,colonne)));
     
    }
     
     
    void faireCase(sudoku S,int ligne,int colonne)
    {
      static int a=1;
     
     
      if(a)
        {
          srand(time(NULL));
          a=0;
        }
     
      writeValeur(S,ligne,colonne,((rand()%9)+1));
     
     
     
     
    }

    Personnellement je suis assez épaté par ce bogue, je ne vois pas du tout d'où il pourrais venir, si quelqu'un avait une idée ou une solution ça serai génial.
    Merci

  2. #2
    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
    Points : 6 498
    Points
    6 498
    Par défaut
    Fais-tu un backtrack, parce que avec ta méthode, si j'ai bien compris (...) tu as peu de chance (pour ne pas dire aucune) de la remplir d'un coup, donc ce n'est absolument pas étonnant que le programme bloque.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 34
    Points : 17
    Points
    17
    Par défaut
    Oui si on veut, mais j'ai trouver le problème par exemple

    Si on a la grille suivante

    123 456 789
    456 781 23-
    ...

    et que le programme arrive ici eh bien il ne trouvera aucune valeur.
    Donc je me suis dit bon okay on va faire une sous fonction qui fais des lignes.

    Un truc dans le genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void faireLigne(sudoku S,int ligne)
    {
      int j;  
    for(j=0;j<9;j++)
    	{
     
    	  do
    	    {
    	      faireCase(S,ligne,j);
    	    }
    	  while(!testLigne(S,ligne));
     
    	}
    }
    Bon après se pose le truc qu'il faut vider la ligne avant de la refaire sinon il va remettre le même chiffre dans chaque case à cause des autres cases.

    Donc je me retrouve avec ça dans le main

    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
    #include <stdlib.h>
    #include <stdio.h>
    #include "struct.h"
    #include "sudoku.h"
     
     
    int main(int argc,char* argv[])
    {
      sudoku S=creer();
      int i,j,k,erreur;
     
      for(i=0;i<9;i++)
        {
          viderLigne(S,i);
          faireLigne(S,i);
          erreur=1;
     
          for(k=0;k<9;k++)
    	erreur=(erreur && testCase(S,i,k)); // on verfie que tous va bien dans chaque colonne et chaque bloc 
     
     
     
          ;
          sauver(S,"essai.sdk"); // on sauve pour les logs. 
     
          if(!erreur)  // si erreur on refais la ligne
    	i--;
     
        }
      affiche(S);
      return 1;
     
    }

    Mais pareil ça n'aboutit toujours pas.


    Edit: Après revérification, mon code marche, Mais il est vraiment très lent, 5-10s pour faire une grille fini. Est-ce que je dois l'optimiser ou re-réfléchir a une méthode pour obtenir une grille fini?

Discussions similaires

  1. Problème d'optimisation combinatoire. Enfin je crois
    Par Arpivu dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 30/07/2007, 11h01
  2. algo problème d'optimisation (trajet)
    Par gugumon dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 22/06/2006, 17h35
  3. Réponses: 9
    Dernier message: 27/04/2006, 15h02
  4. Problème d'optimisation
    Par jozes dans le forum Langage
    Réponses: 8
    Dernier message: 15/02/2006, 15h41
  5. Recherche de pistes pour un problème d'optimisation
    Par TiKeuj dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 15/08/2005, 15h50

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