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 :

Besoin d'aide pour solveur de Sudoku en Backtracking


Sujet :

C

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 6
    Points : 7
    Points
    7
    Par défaut Besoin d'aide pour solveur de Sudoku en Backtracking
    Bonjour à tous !

    Je cherche à créer un jeu de sudoku pour mon projet de fin d'année.
    J'ai déjà trois méthodes de résolution à savoir :
    - Par inclusion
    - Par exclusion
    - Par paires exclusives

    Je cherche a réaliser ma dernière méthode, celle à choix multiple.
    (utilisation d'hypothèse)

    On cherche une case avec peu de possibilités, on teste une des possibilité,
    on essaye de résoudre la grille
    => ca marche, c'est cool !
    => ca marche pas, on recommence depuis le début.

    Ma grille est une grille de [11][10]
    1ere ligne : compteurs de colonnes
    1ere colonne : compteurs de lignes
    11eme ligne : compteurs de régions (bloc 3x3)
    La case [0][0] stocke le compteurs de cases remplies.

    Un tableau a 3 dimensions me sert pour les possibilités de chaque cases :
    plan 1 : chiffre 1 (pour la case x,y => 1 si possible; 0 sinon)
    etc...
    Le plan 0 comptent le nombre de possibilités par case.

    Mon cube : [11][10][10]
    Les 1ere ligne et colonne ainsi que la derniere ligne fonctionne comme
    pour la grille. Elles ne sont pas utilisées pour le plan 0
    et la case [0][0] est aussi inutile.

    Si quelqu'un pouvait me mettre sur la voie, je lui en serait très reconnaissant...
    Je travaille depuis un nombre d'heure assez impressionnant d'heures dessus.
    Mes tests n'ont pas été très concluants.
    J'ai aussi essayé avec un tutoriel sur le backtracking mais ça n'a pas marché...

    voila mon 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
     
    int methode5(Grille grille, int position)
    {	int k;
        if (position == 9*9)
            return VRAI;
     
        int i = position/9+1, j = position%9+1;
     
        if (grille[i][j] != 0)
            return methode5(grille, position+1);
     
        for (k=1; k <= 9; k++)
        {
            if (absentLigne(k,grille,i) && absentColonne(k,grille,j) && absentRegion(k,grille,i,j))
            {
                grille[i][j] = k;
     
                if ( methode5(grille, position+1) )
                    return VRAI;
            }
        }
        grille[i][j] = 0;
     
        return FAUX;
    }
    Mes fonctions absentLigne, absentColonne et absentRegion :
    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
     
    // VERIFIE SI UN NOMBRE EXISTE DANS UNE LIGNE
    int absentLigne(int k, Grille g, int i)
    {	int j;
    	for(j=1;j<=MAX;j++)
    	{	if(g[i][j]==k)
    		{	return FAUX;	}
    	}
    	return VRAI;
    }
     
    // VERIFIE SI UN NOMBRE EXISTE DANS UNE COLONNE
    int absentColonne(int k, Grille g, int j)
    {	int i;
    	for(i=1;i<=MAX;i++)
    	{	if(g[i][j]==k)
    		{	return FAUX;	}
    	}
    	return VRAI;
    }
     
    // VERIFIE SI UN NOMBRE EXISTE DANS UNE REGION
    int absentRegion(int k, Grille g, int i, int j)
    {
    	int ideb = i-(i%3)+1, jdeb = j-(j%3)+1;
    	for (i=ideb; i < ideb+3; i++)
    	{	for (j=jdeb; j < jdeb+3; j++)
    	       	{	if (g[i][j] == k)
    			{	return FAUX;	}
    		}
    	}
    	return VRAI;
    }
    Si quelqu'un y voit une erreur, merci de la signaler

  2. #2
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 6
    Points : 7
    Points
    7
    Par défaut
    Je crois que j'ai trouvé ce qui ne va pas...
    J'utilise comme dans le tuto une variable entiere : position
    et : i=position/9+1 j=position%9+1
    J'ai vérifié, c'est sur, ca va pas ca mais je sais pas quoi mettre a la place. Si vous avez une idée...
    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 10/11/2014, 21h57
  2. besoin d'aide pour le composant DBComboBox
    Par jane2002 dans le forum Bases de données
    Réponses: 8
    Dernier message: 28/02/2004, 19h01
  3. [Kylix] besoin d'aide pour installer kylix3
    Par Sph@x dans le forum EDI
    Réponses: 3
    Dernier message: 11/02/2004, 13h53
  4. [TP]besoin d'aide pour commandes inconnues
    Par Upal dans le forum Turbo Pascal
    Réponses: 15
    Dernier message: 03/10/2002, 10h48
  5. Besoin d'aide pour l'I.A. d'un puissance 4
    Par Anonymous dans le forum C
    Réponses: 2
    Dernier message: 25/04/2002, 17h05

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